分治策略是将规模较大的问题分解成规模小的问题,问题不变,规模变小。导致了递归过程的产生。
分治策略能解决问题的特征:
1 该问题的规模缩小到一定程度可以很容易解决
2 该问题可以分解为若干个规模较小的相同问题
3 使用小的规模解 ,可以合并为原规模的解
4 该问题分解的各个子规模是相互独立的。
以下两个例子
第一个是查找数组中的元素并返回下标
int Find(const int* br, int n, int val)
{
if (n <= 0 || br[n - 1] == val)
{
return n - 1;
}
else
{
return Find(br, n - 1, val);
}
}
int FindPos(const int* br, int n, int val)
{
if (br == NULL || n < 1) return -1;
return Find(br, n, val);
}
第二个是打印一个数组
void Print(const int* br, int &n)
{
if (n > 0)
{
Print(br, --n);
cout << br[n] << " ";
}
}
void Print_Ar(const int* br, int n)
{
if (br == NULL || n < 1) return;
Print(br, n);
cout << endl;
}
快速排序也是对分治策略的应用
下面是快排里的划分函数
思想是在待排序列选第一个数作为比较的数 ,让这个待排序列所有小于它的数都在左边,让所有小于它的数都在右边 , 然