1. 分治: (divide and conquer) 一个大的问题,可以分解为相似的子问题,每个相似的子问题都和原问题有一样的求解方法。可以将问题细化,直到子问题足够小能够求解,然后将子问题的解逐级合并,以最终求得原问题的解。
2. 归并排序算法的递归实现。
#include <stdio.h>
#include <stdlib.h>
#define max 100
int tmp[max];
void printArray(int* a, int len);
void merge(int* a, int low, int mid, int high);
void mergeSort(int *a, int low, int high);
int main(int argc, char* argv[])
{
int a[10] = {5, 4, 3, 2, 1, 3, 3, 3, 4, 0};
int len = 10;
mergeSort(a, 0, len-1);
printArray(a, len);
return 0;
}
void printArray(int* a, int len) {
int i;
for(i=0; i<len; i++) {
printf("%d\t", a[i]);
}
printf("\n");
}
void merge(int* a, int low, int mid, int high) {
int i;
int j;
int k;
for(i=low; i<=high; i++) {
tmp[i] = a[i];
}
j=low;
k=mid+1;
for(i=low; i<=high && j<=mid && k<=high; ) {
if(tmp[j]<=tmp[k]) {
a[i++] = tmp[j++];
}else{
a[i++] = tmp[k++];
}
}
while(j<=mid) a[i++] = tmp[j++];
while(k<=high) a[i++] = tmp[k++];
}
void mergeSort(int* a, int low, int high) {
int mid;
if(low<high) {
mid = (low+high) >> 1;
mergeSort(a, low, mid);
mergeSort(a, mid+1, high);
merge(a, low, mid, high);
}
}
以上参见《算法导论》的第二章。