分治策略在我们的排序算法中的快速排序、归并以及二分查找中经常用到,本文就来探讨一下分治策略。当然,与分治策略密不可分的还有我们经常用到的递归。
目录
一、递归基础
一个直接或间接的调用自身的算法称为递归算法。递归的使用会让我们对于问题的理解更加的清楚。但是并非所有的程序都适合用递归去进行解决。
二、分治策略基础
分治策略的设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。递归的解决这些子问题,然后将这些子问题的解合并得到原问题的解。
它缩小的是问题的规模,反复使用分治策略,可以使子问题与原问题类型一致而规模却不断缩小。在分治策略中它的主要思想就是划分,尽可能将问题的规模划分最小。
三、来看几个递归分治的例子
1、快速排序
快速排序是我们八大排序中的一种,它的主要思想就是基于划分的,通过划分,将问题的规模缩小,对子问题进行解决最后合并得到原问题的解。快排的最主要的一点就是做好划分。因此在实现快排的时候,划分部分我们有三种方法。
(1)划分部分
第一是按照通常的做法从第一个开始选取记录,进行划分;
第二是三位取中法,即就是找到原序列中的左中右三个位置的值,找到第二大的数值作为标记;
第三是随机化法,随机选取一个位置的数值,把最左边的值与其进行交换。
(2)排序部分
第一种是按照递归的做法实现排序;
第二种是非递归实现排序,在非递归实现排序的时候可以利用栈、队列、pair等容器作为支持;
具体实现代码:
//划分部分:第一个数值作为记录进行交换
template<class Type>
int Partition(Type *arr,int left,int right)
{
int i = left;
int j = right;
Type temp = arr[i];
while(i < j)
{
while(i<j && arr[j] > temp