基本思想
分而治之
可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。
合并相邻有序子序列
再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。
代码实现
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 int a[500005],b[500005];//b 为排完序的数组 6 long long ans; 7 void mergesort(int l,int r) 8 { 9 if(l==r) 10 return; 11 int mid=(l+r)>>1; 12 mergesort(l,mid); 13 mergesort(mid+1,r); 14 int i=l,j=mid+1,k=l; 15 while(i<=mid&&j<=r) 16 { 17 if(a[i]<=a[j]) 18 b[k++]=a[i++]; 19 else b[k++]=a[j++]; 20 } 21 while(i<=mid) b[k++]=a[i++]; 22 while(j<=r) b[k++]=a[j++]; 23 for(int q=l;q<=r;q++) a[q]=b[q]; 24 } 25 int main() 26 { 27 int n; 28 scanf("%d",&n); 29 for(int i=1;i<=n;i++) 30 scanf("%d",&a[i]); 31 mergesort(1,n); 32 for(int i=1;i<=n;i++) 33 printf("%d ",b[i]); 34 return 0; 35 }