【算法】递归和分治策略

分治策略在我们的排序算法中的快速排序、归并以及二分查找中经常用到,本文就来探讨一下分治策略。当然,与分治策略密不可分的还有我们经常用到的递归。

目录

一、递归基础

二、分治策略基础

三、来看几个递归分治的例子

         1、快速排序 

2、求第K大(小)/最小(大)的K个数

3、最接近点对问题


一、递归基础

一个直接或间接的调用自身的算法称为递归算法。递归的使用会让我们对于问题的理解更加的清楚。但是并非所有的程序都适合用递归去进行解决。

二、分治策略基础

分治策略的设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。递归的解决这些子问题,然后将这些子问题的解合并得到原问题的解。

它缩小的是问题的规模,反复使用分治策略,可以使子问题与原问题类型一致而规模却不断缩小。在分治策略中它的主要思想就是划分,尽可能将问题的规模划分最小。

三、来看几个递归分治的例子

         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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值