归并排序 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 }