多路归并排序
来源:互联网 发布:raysource mac 编辑:程序博客网 时间:2024/05/22 13:50
没写过失败树,用它来实现下多路归并排序
测试数据:
4
4 43 545 21 44
6 1 4 8 2 6 0
4 1 -1 3 -6
7 8 1 -5 -6 5 -11 33
第一行代表是几路
后面一共4行,每行第一个数表示这行后面一共有多少个数字
对每行数据先快排,然后用失败树进行多路归并
#include <iostream>#include <vector>#include <cstdio>#include <algorithm>using namespace std;struct node{ int num, val;};struct contrast{ bool operator() (const node &a,const node &b) { return a.val < b.val; }} cmp;vector<vector<node> > record;int main(){ int k; scanf("%d", &k); int total = 2 * k - 1; vector<node> tree(total + 1); vector<int> index(total + 1); for(int i = 0; i <= total; i++) index[i] = i; vector<vector<node>::iterator> head(k); for(int i = 0; i < k; i++) { int num; scanf("%d", &num); vector<node> v; for(int j = 0; j < num; j++) { node data; data.num = i; scanf("%d", &data.val); v.push_back(data); } sort(v.begin(), v.end(), cmp); record.push_back(v); } for(int i = 0; i < k; i++) head[i] = record[i].begin(); int tot = k; for(int i = 0; i < k; i++) { tree[total - k + i + 1].val = head[i]->val; tree[total - k + i + 1].num = head[i]->num; head[i]++; if(head[i] == record[i].end()) tot--; } while(true) { if(tot == 0) break; for(int ed = total / 2; ed > 0; ed--) { int left = ed * 2, right = ed * 2 + 1; if(tree[left].val < tree[right].val) { tree[ed].val = tree[left].val; tree[ed].num = tree[left].num; index[ed] = index[left]; } else { tree[ed].val = tree[right].val; tree[ed].num = tree[right].num; index[ed] = index[right]; } } printf("%d ", tree[1].val); if(head[tree[1].num] == record[tree[1].num].end()) { tot--; tree[index[1]].num = -1; tree[index[1]].val = INT_MAX; } else { tree[index[1]].val = head[tree[1].num]->val; tree[index[1]].num = head[tree[1].num]->num; head[tree[1].num]++; } } printf("\n"); return 0;}输出结果:
-11 -6 -6 -5 -1 0 1 1 1 2 3 4 5 6 8 8 21 33 43 44 545
有个问题是我在
record.push_back(v);后面加head[i] = record[i].begin();让它每次循环的时候head指向每个数据段的头,但是这样程序有错,head感觉指向错误了,不知什么原因
要在这个循环外面给每个head赋值才成....不知道是为什么。。。谁能帮忙解答下
- 多路归并排序
- 多路归并排序
- 多路归并排序
- 多路归并排序
- 多路归并排序
- 多路归并排序
- 数据结构 外部排序 多路归并排序
- 归并排序:二路归并
- 归并排序--二路归并
- 归并排序(2-路归并排序)
- 归并排序、二路归并排序
- 位图排序、多路归并排序-应对磁盘文件排序
- 二路和多路归并排序
- 多路归并排序【JAVA实现】
- 大数据多路归并排序
- 败者树 多路归并排序
- 大数据多路归并排序
- 大数据多路归并排序
- Porting OpenCV 2.3.1 to iPhone 3GS/4/4S
- 工厂方法模式
- javascript 设计模式
- 通过SharedPreference对配置的参数进行储存
- [笨木头“创业”路]No.4 历练
- 多路归并排序
- quicker.em
- getsockopt,setsockopt用法小结
- Ubuntu学习笔记之:如何拨号上网
- Windows内核对象无效返回值——NULL或者INVALID_HANDLE_VALUE??
- Android单元测试
- 学习总结
- linux下安装软件的办法
- 3.60