歸併排序、逆序對
阿新 • • 發佈:2022-04-22
歸併排序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 whileView Code(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];View Code8 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 }
用途:氣泡排序、奇數碼、
求逆序對的常用方法還有樹狀陣列,