二路归并排序
2015-04-11 20:33
211 查看
递归版本(也是最方便的版本咯)
#include<iostream> #include<cstdio> const int max=1000; void merge(int *rui,int L1start,int L1end,int L2start,int L2end) //分组归并 { int i=L1start,j=L2start; int temp[max],index=0; while(i<=L1end&&j<=L2end) { if(rui[i]<=rui[j]) { temp[index++]=rui[i++]; } else { temp[index++]=rui[j++]; } } while(i<=L1end) { temp[index++]=rui[i++]; } while(j<=L2end) { temp[index++]=rui[j++]; } for(int i=0;i<index;++i) { rui[L1start+i]=temp[i]; //注意i不能从0开始,二路的话右边那组起点可不是0 } } void MergeSort(int *str,int left,int right) { if(left<right)//这是递归边界 { int mid=(left+right)/2; MergeSort(str,left,mid); MergeSort(str,mid+1,right); merge(str,left,mid,mid+1,right); } } using namespace std; int main() { int str[]={66,12,33,57,64,27,18,100,24,599}; MergeSort(str,0,9); for(int i=0;i<10;++i) { cout<<str[i]<<" "; } return 0; }