归并排序采用的是分而治之的思想。
分治模式有三个步骤:
分解(divide):把原问题分解为一系列子问题
解决(conquer):递归(recursive)地求解各子问题。若子问题足够小,则直接求解。
合并(combine):将子问题的结果合并成原问题的解。
二路归并排序的思路就是把序列分解成子序列,再递归使用合并排序法合并成一个有序序列。
void merge(int a[],int p,int q,int r) { int i,j; int n1,n2,k; n1 = q-p+1; n2 = r-q; int *left,*right; left = (int*) malloc(n1*(sizeof(int))); right = (int*)malloc(n2*(sizeof(int))); for(i = 0,k = p;i<n1;i++,k++) { left[i] = a[k]; } for(i = 0,k = q+1;i<n2;i++,k++) { right[i] = a[k]; } for(i = 0,j = 0,k = p;i<n1&&j<n2;k++) { if(left[i]<right[j]) { a[k] = left[i]; i++; } else { a[k] = right[j]; j++; } } if(i<n1) { for(int t = i;t<n1;t++,k++) a[k] = left[t]; } if(j<n2) { for(int t = j;t<n2;t++,k++) a[k] = right[t]; } } void mergsort(int a[],int start,int end) { if(start<end) { int h = (start+end)/2; mergsort(a, start, h); mergsort(a, h+1, end); merge(a, start, h, end); } }