分治法的主要思想为将一个大问题转换成一个小问题,再解决每个小问题。主要分为三个步骤:
1、Devide——大问题分解成小的问题
2、Conquer——(递归地)解决小问题
3、Combine——将解合并
下面介绍一些比较常见的运用分治思想的算法。
一、归并排序
归并排序是性能比较好的一种排序方法,它的时间复杂度是O(nlgn),是典型的运用了分治思想的算法。归并排序的步骤如下:
1、分解。将待排序的n个元素分解成n/2的子序列。
2、解决。使用归并排序递归的排列两个子序列。
3、合并。将两个已排序的子序列合并得出结果。
代码如下:
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)