分治策略是将规模较大的问题分解成规模小的问题,问题不变,规模变小。导致了递归过程的产生。
分治策略能解决问题的特征:
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;
}
快速排序也是对分治策略的应用
下面是快排里的划分函数
思想是在待排序列选第一个数作为比较的数 ,让这个待排序列所有小于它的数都在左边,让所有小于它的数都在右边 , 然后在分别在对左边和右边排序,一直这样循环下去,直到分支的待排数剩1时 ,该数列即为有序数列
int Parition(int* br, i

分治策略通过将大问题分解为小问题解决,适用于规模较小时能轻易解决且子问题相互独立的情况。快速排序是其典型应用,通过选取基准元素进行划分,将小于基准的元素放在左侧,大于基准的在右侧,再对两部分递归进行排序,最终得到有序序列。本文介绍了快速排序的划分函数及递归和循环调用的方法。
最低0.47元/天 解锁文章
3032

被折叠的 条评论
为什么被折叠?



