POJ2299 Ultra-QuickSort 归并排序 C语言

题目:http://poj.org/problem?id=2299

题目大意:给出一串数字,求出逆序对的数目

思路:用归并排序

提交情况:AC 1次

总结:拖了好久的题,终于做了。先开始对归并排序思路还是不理解,经过同学讲终于明白了。写题之前一定要仔细将原理想清楚啊。

 

AC code:

View Code
 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #define MAXN (500000 + 100)
5 #define I64 __int64
6
7 I64 num[MAXN], sort[MAXN];
8 I64 res;
9
10 void merge(int l, int mid, int r) {
11 int i = l, j = mid + 1, k = l; //每次k=l,新排序的数接在末端
12 while(i <= mid && j <= r) {
13 if(num[i] < num[j])
14 sort[k++] = num[i++];
15 else {
16 sort[k++] = num[j++];
17 res += mid - i + 1;
18 }
19 }
20 while(i <= mid)
21 sort[k++] = num[i++];
22 while(j <= r) {
23 sort[k++] = num[j++];
24 }
25 }
26
27 void copy(int l, int r) { //将原数组变为有序的
28 for(int i = l; i <= r; i++)
29 num[i] = sort[i];
30 }
31
32 void mergesort(int l, int r) {
33 if(l < r) {
34 int mid = (l + r) / 2;
35 mergesort(l, mid);
36 mergesort(mid + 1, r);
37 merge(l, mid, r);
38 copy(l, r);
39 }
40 }
41
42 void Insert(int n) {
43 int i;
44 for(i = 1; i <= n; i++)
45 scanf("%I64d", &num[i]);
46 }
47
48 int main() {
49 int n;
50 while(scanf("%d", &n), n) {
51 memset(sort, -1, sizeof(sort));
52 res = 0;
53 Insert(n);
54 mergesort(1, n);
55 printf("%I64d\n", res);
56 }
57 return 0;
58 }

posted @ 2011-07-22 08:23  cloehui  阅读(256)  评论(0编辑  收藏  举报