归并排序

推荐一个网站 https://visualgo.net/zh  这个网站可以看到很多算法的动态演绎

大概就是这个亚子,可以自己去看归并排序

下边给出归并排序的代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 
 5 const int maxn=501000;
 6 ll n,m,i,j,k,a[maxn],b[maxn],cnt;
 7 
 8 void mergesort(ll a[],ll l,ll r)
 9 {
10     if (r-l<1) return ;
11     ll mid=(l+r)>>1;
12     mergesort(a,l,mid);
13     mergesort(a,mid+1,r);
14     ll i=l,j=mid+1;             // i是第一段序列的下标, j是第二段序列的下标
15     for (ll k=l;k<=r;k++){
16         if (j>r || i<=mid && a[i]<=a[j])     // 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下扫描
17             b[k]=a[i++];
18         else{
19             cnt+=mid-i+1;
20             b[k]=a[j++];
21         }
22     }
23     for (ll k=l;k<=r;k++) a[k]=b[k];
24 }
25 
26 int main()
27 {
28     cin>>n;
29     for (i=1;i<=n;i++) cin>>a[i];
30     cnt=0;
31     mergesort(a,1,n);
32     cout<<cnt<<endl;        //cnt是让序列a有序的最小交换次数
33     for(int i=1;i<=n;i++) cout<<a[i]<<' ';
34     return 0;
35 }

 

posted @ 2019-08-16 09:14  只能过样例嘤嘤嘤  阅读(146)  评论(0编辑  收藏  举报

……