<算法图解>读书笔记:第4章 快速排序

第4章 快速排序

4.1 分而治之

“分而治之”( Divide and conquer)方法(又称“分治术”) ,是有效算法设计中普遍采用的一种技术。
所谓“分而治之” 就是把一个复杂的算法问题按一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的解,把各部分的解组成整个问题的解,这种朴素的思想来源于人们生活与工作的经验,也完全适合于技术领域。诸如软件的体系结构设计、模块化设计都是分而治之的具体表现。
来自<百度百科>

  • 使用D&C(分而治之)解决问题的过程包括两个步骤:
    1. 找出基线条件,这种条件必须尽可能简单
    2. 不断将问题分解(或者说缩小规模),知道符合基线条件
  • D&C并非解决问题的算法,而是一种解决问题的思路
  • 编写设计数组的递归函数时,基线条件通常是数组为空或只包含一个元素

4.2 快速排序

  • 快速排序是一种常用的排序算法,比选择排序快得多.例如,C语言标准库中的函数qsort实现的就是快速排序.快速排序也使用D&C

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

  • 快速排序的工作原理

    1. 首先从数组中选择一个元素,这个元素称为基准值
    2. 接下来找出比基准值小的元素以及比基准值大的元素,这被称为分区
      • 只是进行分区,得到的两个子数组是无序的
    3. 对两个子数组进行快速排序
  • python快速排序代码

    def quicksort(array):
        if len(array) < 2:
            return array #基线条件
        else:
            pivot = array[0] #递归条件
            less = [i for i in array[1:] if i <= pivot]
            greater = [i for i in array[1:] if i > pivot]
        return quicksort(less) + [pivot] + quicksort(greater)
    
    myList = [5,3,25,6,9,11,1,66,21,88,74,2]
    print(quicksort(myList))
    

4.3 再谈大O表示法

  • 快速排序的独特之处在于,其速度取决于选择的基准值
  • 快速排序在最糟糕的情况运行时间为\(O _{(n^2)}\),平均情况运行时间为\(O _{(n^*logn)}\)

4.4 小结

  • D&C将问题分解
  • 实现快速排序时,请随机地选择用在基准值的元素,快速排序的平均运行时间为\(O _{(n^*logn)}\)
  • 大O表示法的常量有时候事关重大,这就是快速排序比合并排序块的原因所在
  • 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,\(O _{(n^*logn)}\)的速度比\(O _{(n)}\)快得多
posted @ 2019-01-22 07:58  汪小鹏boy  阅读(149)  评论(1编辑  收藏  举报