多路归并
来源:互联网 发布:铝合金型材批发 知乎 编辑:程序博客网 时间:2024/05/19 10:08
在书上外部排序那一章。
代码如下:
void Merge(int **in, int m,int n,int* out){static int loser_tree[M*2-1];static int index_tree[M*2-1];static int next[M];for(int i=0;i<m;i++){in[i][n]=INT_MAX;}for(int j=0,i=m-1; j<m && i<m*2-1;i++,j++){loser_tree[i]=in[j][0];index_tree[i]=j;}for(int i=0;i<m;i++){next[i]=0;}for(int ii=0;ii<m*n;ii++){for(int i=m-2;i>=0;i--){int left=i*2+1;int right=i*2+2;if(loser_tree[left]<=loser_tree[right]){loser_tree[i]=loser_tree[left];index_tree[i]=index_tree[left];}else{loser_tree[i]=loser_tree[right];index_tree[i]=index_tree[right];}}b[ii]=loser_tree[0];int team_changed=index_tree[0];next[team_changed]++;int temp=next[team_changed];loser_tree[m-1+team_changed]=in[team_changed][temp];}}
完整代码:
话说,第一次想到二级指针还可以这么玩。。。
#include <iostream>#include <cassert>#include <algorithm>using namespace std;const int M=10;const int N=20;int a[M][N+1];int b[M*N];int* c[M];void Merge(int **in, int m,int n,int* out){static int loser_tree[M*2-1];static int index_tree[M*2-1];static int next[M];for(int i=0;i<m;i++){in[i][n]=INT_MAX;}for(int j=0,i=m-1; j<m && i<m*2-1;i++,j++){loser_tree[i]=in[j][0];index_tree[i]=j;}for(int i=0;i<m;i++){next[i]=0;}for(int ii=0;ii<m*n;ii++){for(int i=m-2;i>=0;i--){int left=i*2+1;int right=i*2+2;if(loser_tree[left]<=loser_tree[right]){loser_tree[i]=loser_tree[left];index_tree[i]=index_tree[left];}else{loser_tree[i]=loser_tree[right];index_tree[i]=index_tree[right];}}b[ii]=loser_tree[0];int team_changed=index_tree[0];next[team_changed]++;int temp=next[team_changed];loser_tree[m-1+team_changed]=in[team_changed][temp];}}void Produce(int **in, int m,int n){for(int i=0;i<m;i++){for(int j=0;j<n;j++){int r=rand()%100;in[i][j]=r;}sort(in[i],in[i]+n);}}void Check(int* a,int n){for(int i=0;i<n-1;i++){assert(a[i]<=a[i+1]);}}void Print1(){/*for(int i=0;i<M;i++){for(int j=0;j<N;j++){cout<<a[i][j]<<"\t";}cout<<endl;}*/for(int i=0;i<M;i++){for(int j=0;j<N;j++){cout<<c[i][j]<<"\t";assert(a[i][j]==c[i][j]);}cout<<endl;}}void Print2(){for(int i=0;i<M*N;i++){cout<<b[i]<<"\t";}cout<<endl;}int main(){for(int i=0;i<M;i++){c[i]=&(a[i][0]);//方便传参数}Produce(c,M,N);Print1();Merge(c,M,N,b);Check(b,M*N);Print2();system("pause");return 0;}
0 0
- 多路归并排序
- 多路归并排序
- 多路归并排序
- 多路归并排序
- 多路归并排序
- 多路归并排序
- 多路归并
- 多路归并
- python&多路归并
- 多路归并问题详解
- lucene 多路归并算法
- 二路归并 && 插入归并 && 原地归并
- 归并排序:二路归并
- 归并排序--二路归并
- 二路和多路归并排序
- 数据结构 外部排序 多路归并排序
- 多路归并的外排序
- 多路归并的外排序
- 字符串Hash的原理与应用
- 代理模式@protocol
- hdu 3870 Catch the Theves 平面图转对偶图
- centos6.2桌面菜单的编辑和配置
- 《调试九法-软硬件错误的排查之道》
- 多路归并
- 内存山介绍和图解析
- csvkit 学习和使用 (四)
- 平安阿里数据库技术交流日总结
- centos6.2的管理终端界面
- Spring注解@Component、@Repository、@Service、@Controller区别
- 关于PE文件——输入表
- eclipse(Link with Editor)
- linux md5 加密字符串和文件方法