归并排序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 }
归并求逆序对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 }
用途:冒泡排序、奇数码、
求逆序对的常用方法还有树状数组,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】