美文网首页iOS开发攻城狮的集散地数据结构与算法
算法小专栏:“D&C思想”与“快速排序”

算法小专栏:“D&C思想”与“快速排序”

作者: 齐舞647 | 来源:发表于2019-04-08 18:19 被阅读1次

    前一篇介绍了递归与尾递归,本篇将基于递归介绍快速排序等相关内容。

    阅读本文你将收获:

    • 分而治之思想:简称D&C,一种递归式解决问题方案。
    • 快速排序:利用D&C思想,实现的一种高效排序方法。

    一、“分而治之”思想(D&C)

    分而治之:(divide and conquerD&C)是一种著名的递归式解决问题的方法。

    某一种解决问题的算法用处有限,而D&C为我们提供的是一种思路。
    当我们面对一个复杂问题手足无措时,我们应该自问:“D&C能解决该问题么?”

    那么,D&C是什么?

    1.1 什么是D&C?

    使用D&C解决问题的过程分为两个步骤:

    1. 找出基线条件,这个条件尽可能简单。(基线条件的定义见上篇
    2. 不断将问题分解(缩小规模),直到全部符合基线条件。

    1.2 D&C的实例

    场景:假设你是一位农场主,你有一块长方形(168m x 64m)的地。

    问题:现在你需要把这块地分成若干个正方形的地(方便管理和种菜),问最大能拆分成多大的小正方形。(注意:不能留空地哦,最大利用土地资源)

    • 方案一:找出“长”和“宽”中,相同的最大的公约数即可。(我的第一反应是这样算)

    • 方案二:使用D&C思想,先从大长方形中去掉几个最大的正方形,再去掉小长方形的几个最大正方形,不断寻找,直到没有小长方形为止。

    步骤:

    1. 找到基线条件:长是宽的整数倍
    2. 不断分解:去除所有最大正方形后,对小长方形进行分解

    图解如图:

    第一次:找到两个边长为64m的大正方形,去除后,留下64m x 40m的小长方形。

    第二次:找到一个边长为40m的小正方形,去除后,留下40m x 24m的小长方形。

    第三次:找到一个边长为24m的小正方形,去除后,留下24m x 16m的小长方形。

    第四次:找到一个边长为16m的小正方形,取出后,留下16m x 8m的小长方形。

    第五次:找到两个边长为8m的小正方形,正好分完。

    因此,该农场分为小正方形田地的最大边长为8m。

    而解决问题的思想,就是用的D&C思想。

    我们再来回顾一下D&C思想的核心:

    • 找出简单的基线条件。
    • 确定如何缩小问题的过,使其符合基线条件。

    二、快速排序

    快速排序(QuickSort)利用的就是D&C思想。它是一种高效的排序方案。

    2.1 快排的思想(基于D&C)

    • 基线条件:当排序数组元素个数小于2个时,直接返回。
    • 缩小规模:每次从待排序数组中选取一个元素(基准值),把小于等于该元素的元素放在一侧,把大于该元素的元素放在另一侧。再对两边的小数组做重复操作。

    2.2 快排的示例

    基于Python,实现了一个快排:
    代码如下:

    def quickSort(arr):
        if len(arr) < 2:
            return arr
        else:
            pivot = arr[0]
            less = [i for i in arr[1:] if i <= pivot]
            greater = [i for i in arr[1:] if i > pivot]
    
            return quickSort(less) + [pivot] + quickSort(greater)
    
    print quickSort([10, 2, 6, 4, 7, 2])
    

    解读一下代码:

    PS:基准值一般可以选取第一个元素,也可以选择最后一个元素。

    2.3 快排的动画演示

    本Demo中,选取的数组的最后一个元素为基准值,把小于等于基准值的元素放在左侧,大于基准值的元素放在右侧。

    相关文章

      网友评论

        本文标题:算法小专栏:“D&C思想”与“快速排序”

        本文链接:https://www.haomeiwen.com/subject/dsrgmqtx.html