分治算法步骤
step1: 将问题划分成同一个问题的几个较小的实例,最好拥有相同的规模。
step2: 对这些较小的实例进行求解(一般采用递归的方法,进一步对问题的实例进行划分),当问题规模足够小的时候,能够很容易地求出问题的解。
step3: 如果有必要的话,合并这些较小问题的解以得到原始问题的解。
以快速排序为例:
//快速排序,start为第一个元素的位置,end为最后一个元素的位置。
void quikSort(int * a, int start, int end)
{
if(start >= end)
return;
//选择中间位置元素作为”基数“(对于基本有序的数列而言,这种选择能够将数列尽可能地均匀划分,即子问题的规模尽量相同)
int mid = start + (end - start) / 2;
int base = a[mid];
a[mid] = a[start];
a[start] = base; //将基数放置起始处,为后续扫描做准备。
//"i指针"从前向后扫描,"j指针"从后向前扫描
int i = start;
int j = end;
//使i扫描过的元素都小于等于base,使j扫描过的元素都大于等于base
while(i < j)
{
while(i < j && a[j] > base)
j--;
if(i < j)
a[i++] = a[j]; //将小于base的元素前移,覆盖i位置的元素
while(i < j && a[i] < base)
i++;
if(i < j)
a[j--] = a[i]; //将大于base的元素后移,覆盖j位置的元素
}
//将被覆盖的基数填补到最终的位置
a[i] = base;
//对子序列执行相同的操作
quikSort(a,start,i-1);
quikSort(a,i+1,end);
}