大家在写归并排序时是不是觉得合并两个序列有点麻烦,有快速的方法吗?
我们全部函数自己写,比如:
#include<bits/stdc++.h> using namespace std; #define MAX_SIZE 50000 int mydata[MAX_SIZE+5]; int mysize;//向量元素实际个数void my_merge(int lo,int mi,int hi)//合并两个序列 { //A分为b,c左右两个数组 int *A=mydata+lo;//合并后的向量 int *C=mydata+mi; int lb=mi-lo,lc=hi-mi; //b,c数组的长度 int *B=new int[lb];//创建B数组=A[0-lb] //int *B=(int*)malloc(sizeof(int)*lb); for(int i=0;i<lb;i++) B[i]=A[i]; //复制 int j=0,k=0;//b,c for(int i=0;j<lb;){ if(j<lb&&(B[j]<=C[k]|| k>=lc/*c空了*/ )) A[i++]=B[j++]; if(k<lc&&(C[k]<B[j])) A[i++]=C[k++]; }//时间< O(n) delete [] B; //free(B); }//一共logn层 void mergeSort(int lo,int hi)//归并排序 { int mi=(lo+hi)>>1; if(lo+2>hi) return; mergeSort(lo,mi); mergeSort(mi,hi);//分治 my_merge(lo,mi,hi);//合并 }//归并排序总的时间复杂度 int main(void) { int n; scanf("%d",&n); mysize=n; for(int i=0;i<n;i++) scanf("%d",&mydata[i]); mergeSort(0,mysize); return 0; }
我们首先会想到C++algorithm里的merge()函数,merge函数可以把两个有序的序列变成一个新的有序序列(注意是新的),这里是设计三个序列,并不能在原序列上进行操作,可是归并排序要在原序列进行操作。
那么还有一个函数似乎可以帮到我们,inplace_merge()。inplace_merge()有三个必须参数,默认合并后排序是升序的,第一个参数是一个序列的起始位置,第二个是该序列的切分位置,第三个参数是该序列区间的结束位置。
比如:
#include<bits/stdc++.h> using namespace std; int main(void) { int t,n; int z[10]={5,6,7,8,9,0,1,2,3,4}; int b[15]; inplace_merge(z,z+5,z+10); for(int i=0;i<10;i++) printf("%d ",z[i]); return 0; }
这两个函数详细解析请点击(地址为http://c.biancheng.net/view/568.html)
代码实现请看:
https://www.cnblogs.com/cchun/archive/2012/05/26/2519394.html