归并排序 mergeSort,分治策略。reference: http://www.cnblogs.com/chengxiao/p/6194356.html
1 #include <stdio.h>
2
3 void mergeSort(int a[], int left, int right);
4 void display(int a[], int len);
5
6 int main(int argc, char *argv[])
7 {
8 int a[] = {2,3,5,1,0,7,5,2};
9 int len = sizeof(a)/sizeof(a[0]);
10 mergeSort(a, 0, len-1);
11
12 display(a, len);
13 return 0;
14 }
15
16 // 归并
17 void merge(int a[], int left, int mid, int right)
18 {
19 int p = left, q = mid+1;
20 int temp[right-left+1];
21 int index = 0;
22 while(p<=mid || q<=right)
23 {
24 if(p>mid)
25 temp[index++] = a[q++];
26 else if(q>right)
27 temp[index++] = a[p++];
28 else if(a[p] >= a[q])
29 temp[index++] = a[q++];
30 else
31 temp[index++] = a[p++];
32
33 }
34 index = 0;
35 int i;
36 for(i=left; i<=right; i++)
37 a[i] = temp[index++];
38 }
39
40 // 递归调用
41 void mergeSort(int a[], int left, int right)
42 {
43 if(left >= right)
44 return;
45 int mid = (left+right)/2;
46 mergeSort(a, left, mid);
47 mergeSort(a, mid+1, right);
48 merge(a, left, mid, right);
49 }
50
51 void display(int a[], int len)
52 {
53 int i;
54 for(i=0; i<len; i++)
55 printf("%d ", a[i]);
56 printf("\n");
57 }