【算法】递归和分治策略

本文深入探讨了递归和分治策略,讲解了它们的基础概念和在快速排序、求K大(小)数、最接近点对问题中的应用。递归是直接或间接调用自身解决问题的方法,而分治策略则是将大问题分解为小问题解决,两者常结合使用,如在快速排序中的划分思想。此外,文章还介绍了不同类型的划分方法和递归实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

目录

一、递归基础

二、分治策略基础

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

         1、快速排序 

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

3、最接近点对问题


一、递归基础

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

二、分治策略基础

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

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

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

         1、快速排序 

         快速排序是我们八大排序中的一种,它的主要思想就是基于划分的,通过划分,将问题的规模缩小,对子问题进行解决最后合并得到原问题的解。快排的最主要的一点就是做好划分。因此在实现快排的时候,划分部分我们有三种方法。

(1)划分部分

         第一是按照通常的做法从第一个开始选取记录,进行划分;

         第二是三位取中法,即就是找到原序列中的左中右三个位置的值,找到第二大的数值作为标记;

         第三是随机化法,随机选取一个位置的数值,把最左边的值与其进行交换。

(2)排序部分

         第一种是按照递归的做法实现排序;

         第二种是非递归实现排序,在非递归实现排序的时候可以利用栈、队列、pair等容器作为支持;

具体实现代码:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值