给定一个无序的数列,由32位整数组成的,序列长度可达500000,现在通过不断的两两交换,把这个序列排成由小到大的有序序列,问交换的次数是多少。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define NN 500005 4 5 int a[NN]; 6 __int64 count; 7 8 void Merge(int data[], int l, int m, int r) 9 { 10 int i = l; 11 int j = m + 1; 12 int k = 0; 13 int *pd; 14 pd = (int*)malloc((r-l+1) * sizeof(int));//归并 15 16 while (i<=m && j<=r) 17 { 18 if (data[i] <= data[j]) 19 { 20 pd[k++] = data[i++]; 21 } 22 else 23 { 24 pd[k++] = data[j++]; 25 count += m - i + 1; 26 } 27 } 28 while (i <= m) 29 { 30 pd[k++] = data[i++]; 31 } 32 while (j<=r) 33 { 34 pd[k++] = data[j++]; 35 } 36 for (i=l, k=0; i<=r; i++, k++) 37 { 38 data[i] = pd[k]; 39 } 40 free(pd); 41 //pd = NULL; 42 } 43 44 void MergeSort(int data[], int l, int r) 45 { 46 if (l < r) 47 { 48 int m= (l + r) / 2; 49 MergeSort(data, l, m); 50 MergeSort(data, m+1, r); 51 Merge(data, l, m, r); 52 } 53 } 54 55 int main(void) 56 { 57 int n; 58 //int i; 59 while (scanf("%d", &n), n) 60 { 61 count = 0; 62 for (int i=0; i<n; i++) 63 { 64 scanf("%d", &a[i]); 65 } 66 MergeSort(a, 0, n-1); 67 printf("%I64d\n", count); 68 } 69 return 0; 70 }