推荐一个网站 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 }