poj 2299 (归并排序)

给定一个无序的数列,由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 }
posted @ 2012-11-15 19:59  尔滨之夏  阅读(277)  评论(0编辑  收藏  举报