多路归并

来源:互联网 发布:铝合金型材批发 知乎 编辑:程序博客网 时间: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