归并排序挺好写的,复杂度不错,还是个稳定性排序算法,而且可以求逆序对个数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; ll a[N],b[N]; void Merge(ll l,ll mid,ll r) { ll i=l,j=mid+1,t=0; while(i<=mid&&j<=r) { if(a[i]>a[j]) b[t++]=a[j++]; else b[t++]=a[i++]; } while(i<=mid) b[t++]=a[i++]; while(j<=r) b[t++]=a[j++]; for(i=0;i<t;i++) a[l+i]=b[i]; } void MergeSort(ll l,ll r) { if(l<r) { ll mid=(l+r)>>1; MergeSort(l,mid); MergeSort(mid+1,r); Merge(l,mid,r); } }
|
在合并中加一步就可以求逆序对:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; ll a[N],b[N],cnt=0; void Merge(ll l,ll mid,ll r) { ll i=l,j=mid+1,t=0; while(i<=mid&&j<=r) { if(a[i]>a[j]) { b[t++]=a[j++]; cnt+=mid-i+1; } else b[t++]=a[i++]; } while(i<=mid) b[t++]=a[i++]; while(j<=r) b[t++]=a[j++]; for(i=0;i<t;i++) a[l+i]=b[i]; } void MergeSort(ll l,ll r) { if(l<r) { ll mid=(l+r)>>1; MergeSort(l,mid); MergeSort(mid+1,r); Merge(l,mid,r); } }
|