归并排序
1 ////////////////////////////////////////////
2 //归并排序 //
3 //Author:Gavin Ge //
4 //Date: 2014.7.5 //
5 ////////////////////////////////////////////
6
7
8 #include < stdio.h >
9 #include < stdlib.h >
10 void merge(int *array,int p,int q,int r)
11 {
12 int i,j;
13 int n1 = q-p+1;
14 int n2 = r-q;
15 int k = p;
16 int *Larray = (int *)malloc(sizeof(int)*(n1+1));
17 int *Rarray = (int *)malloc(sizeof(int)*(n2+1));
18 for(i = 0;i < n1;i++)
19 {
20 Larray[i] = array[p+i];
21 }
22 for(j = 0;j< n2;j++)
23 {
24 Rarray[j] = array[q+1+j];
25 }
26 i = j = 0;
27 while( i < n1 && j < n2 )
28 {
29 if(Larray[i] <= Rarray[j])
30 {
31 array[k] = Larray[i];
32 i = i + 1;
33 k++;
34 }
35 else
36 {
37 array[k] = Rarray[j];
38 j = j + 1;
39 k++;
40 }
41 }
42
43 while(i < n1)
44 array[k++] = Larray[i++];
45 while(j < n2)
46 array[k++] = Rarray[j++];
47 free(Larray);
48 Larray = NULL;//消除迷途指针
49 free(Rarray);
50 Rarray = NULL;//消除迷途指针
51 }
52
53 void mergesort(int *array,int p,int r)
54 {
55 int q;
56 if(p < r)
57 {
58 q = (p+r)/2;
59 mergesort(array,p,q);
60 mergesort(array,q+1,r);
61 merge(array,p,q,r);
62 }
63 }
64
65 int main()
66 {
67 int i;
68 int array[] = {5,2,3,4,5,6,7,1,9};
69 int length = sizeof(array)/sizeof(array[0]);
70 printf("处理之前:\n");
71 for(i = 0;i < length;i++)
72 {
73 printf("%d",array[i]);
74 }
75 printf("\n排序之后\n");
76 mergesort(array,0,length);
77 for(i = 0;i < length;i++)
78 {
79 printf("%d",array[i]);
80 }
81 return 0;
82 }