归并排序模板
逆序对永远只会树状数组写法OrzOrzOrz……
1 #include <stdio.h> 2 3 const int _N = 12000; 4 5 int A[_N], B[_N], cnt; 6 7 void Merge(int l, int r) 8 { 9 int i, j, k, mid; 10 mid = l+r >> 1; 11 i = k = l, j = mid+1; 12 while (i <= mid && j <= r) 13 if (A[i] <= A[j]) B[k++] = A[i++]; 14 else B[k++] = A[j++], cnt += mid-i+1; 15 while (i <= mid) B[k++] = A[i++]; 16 while (j <= r) B[k++] = A[j++]; 17 for (i = l; i <= r; ++i) A[i] = B[i]; 18 return; 19 } 20 21 void MergeSort(int l, int r) 22 { 23 if (l >= r) return; 24 int mid = l+r >> 1; 25 MergeSort(l, mid), MergeSort(mid+1, r); 26 Merge(l, r); 27 return; 28 } 29 30 int main() 31 { 32 int i, N; 33 scanf("%d", &N); 34 for (i = 1; i <= N; ++i) scanf("%d", &A[i]); 35 MergeSort(1, N); 36 for (i = 1; i <= N; ++i) printf("%d ", A[i]); 37 printf("\nNiXuDuiShu: %d\n", cnt); 38 return 0; 39 }