[归并排序]

基本思想

分而治之

可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。阶段可以理解为就是递归拆分子序列的过程,递归深度为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 }

 

posted @ 2019-03-10 15:46  风丨铃  阅读(252)  评论(0编辑  收藏  举报