1. 程式人生 > >【模板】歸併排序(+求逆序對)

【模板】歸併排序(+求逆序對)

沒有網址qwq

沒有oj

翻樹狀陣列看到求逆序對先複習一下歸併求逆序對qwq

逆序對真是個神奇的東西啊QAQ

純屬隨手一打隨手一貼quq

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int n, a[100010], b[100010], cnt = 0;
 5 void merge_sort(int l, int r) {
 6     if(r-l > 0) {
 7         int mid = (l+r)/2;
 8         int i = l, p = l, q = mid+1
; 9 merge_sort(l, mid); 10 merge_sort(mid+1, r); 11 while(p <= mid || q <= r) { 12 if(q > r || ((p<=mid) && a[p] <= a[q])) //p<=mid !!!!!別打成p<mid!!! 13 b[i++] = a[p++]; 14 else b[i++] = a[q++], cnt = cnt + (mid - p + 1
); 15 //mid - 當前已經比較到哪個元素了 (p) 16 //別減成i 或者 l 17 } 18 for(int i = l; i <= r; i++) 19 a[i] = b[i]; 20 } 21 } 22 int main() { 23 scanf("%d", &n); 24 for(int i = 1; i <= n; i++) { 25 scanf("%d", &a[i]); 26 }
27 merge_sort(1, n); 28 printf("qwq排序後:\n"); 29 for(int i = 1; i <= n; i++) 30 cout<<a[i]<<' '; 31 cout<<endl<<"quq逆序對數:"<<cnt<<endl; 32 return 0; 33 }