1. 程式人生 > 其它 >歸併排序、逆序對

歸併排序、逆序對

歸併排序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

 

用途:氣泡排序、奇數碼、

求逆序對的常用方法還有樹狀陣列