【模板】歸併排序(+求逆序對)
阿新 • • 發佈:2018-11-11
沒有網址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 }