归并排序原理:
分治法:
把大小为 n 的数组划分为 n段序列, 不断的两两合并序列同时排序
(归并排序的时间复杂度为 Nlog2N)
- void merge(int *a,int q,int m,int r){
- int ql=m-q+1; //获取两段序列的长度
- int rl = r-m;
- int *front=new int[ql]; //新开辟两段内存空间用于存放两段序列
- int *back=new int[rl];
- for(int i=0;i<ql;i++){ //分别保存两段序列
- front[i]=a[q+i]; //q==第一段序列首元素下标
- }
- for(int i=0;i<rl;i++){ //m+1 ==第二段序列首元素下标
- back[i]=a[m+i+1];
- }
- int i=0,j=0,k=q;
- while(i<ql && j<rl){ //按顺序合并数组
- if(front[i]<back[j]){
- a[k++]=front[i++];
- }
- else{
- a[k++]=back[j++];
- }
- }
- while(i<ql){ //合并剩余的元素
- a[k++]=front[i++];
- }
- while(j<rl){
- a[k++]=back[j++];
- }
- }
void mergesort(int *a,int l,int r){ l=首元素下标, r 为尾元素下标
int gap = (l+r)/2; //gap == m( 第一段序列的尾元素下标)
if(l
//递归划分为两段进行排序,然后合并
mergesort(a,l,gap);
mergesort(a,gap+1,r);
merge(a,l,gap,r);
}
}