归并排序O(nlong)

复制代码
 1 #include<bits/stdc++.h>
 2 #define N 100010
 3 using namespace std;
 4 
 5 int n;
 6 int a[N],tmp[N];
 7 void merge_sort(int l,int r) {
 8     if(l>=r) return;
 9     int mid=l+r>>1;
10     merge_sort(l,mid);
11     merge_sort(mid+1,r);
12     int k=0,i=l,j=mid+1;
13     while(i<=mid&&j<=r) {
14         if(a[i]<=a[j]) tmp[k++]=a[i++];
15         else tmp[k++]=a[j++];
16     }
17     while(i<=mid) tmp[k++]=a[i++];
18     while(j<=r) tmp[k++]=a[j++];
19     for(int i=l,j=0; i<=r; i++,j++) a[i]=tmp[j];
20 }
21 int main() {
22     cin>>n;
23     for(int i=1; i<=n; i++) cin>>a[i];
24     merge_sort(1,n);
25     for(int i=1; i<=n; i++) cout<<a[i]<<" ";
26     return 0;
27 }
View Code
复制代码

 

归并求逆序对O(nlogn)

复制代码
 1 #include<bits/stdc++.h>
 2 #define N 500010
 3 using namespace std;
 4 
 5 int n;
 6 long long cnt;
 7 int a[N],tmp[N];
 8 void merge_sort(int l,int r) {
 9     if(l>=r) return;
10     int mid=l+r>>1;
11     merge_sort(l,mid);
12     merge_sort(mid+1,r);
13     int k=0,i=l,j=mid+1;
14     while(i<=mid&&j<=r) {
15         if(a[i]<=a[j]) tmp[k++]=a[i++];
16         else tmp[k++]=a[j++],cnt+=mid-i+1;
17     }
18     while(i<=mid) tmp[k++]=a[i++];
19     while(j<=r) tmp[k++]=a[j++];
20     for(int i=l,j=0; i<=r; i++,j++) a[i]=tmp[j];
21 }
22 int main() {
23     while(cin>>n&&n) {
24         cnt=0;
25         for(int i=1; i<=n; i++) cin>>a[i];
26         merge_sort(1,n);
27         cout<<cnt<<endl;
28     }
29 
30     return 0;
31 }
View Code
复制代码

 

用途:冒泡排序、奇数码、

求逆序对的常用方法还有树状数组

posted on   我疯故我在  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】



点击右上角即可分享
微信分享提示