<算法图解>读书笔记:第4章 快速排序
第4章 快速排序
4.1 分而治之
“分而治之”( Divide and conquer)方法(又称“分治术”) ,是有效算法设计中普遍采用的一种技术。
所谓“分而治之” 就是把一个复杂的算法问题按一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的解,把各部分的解组成整个问题的解,这种朴素的思想来源于人们生活与工作的经验,也完全适合于技术领域。诸如软件的体系结构设计、模块化设计都是分而治之的具体表现。
来自<百度百科>
- 使用D&C(分而治之)解决问题的过程包括两个步骤:
- 找出基线条件,这种条件必须尽可能简单
- 不断将问题分解(或者说缩小规模),知道符合基线条件
- D&C并非解决问题的算法,而是一种解决问题的思路
- 编写设计数组的递归函数时,基线条件通常是数组为空或只包含一个元素
4.2 快速排序
- 快速排序是一种常用的排序算法,比选择排序快得多.例如,C语言标准库中的函数qsort实现的就是快速排序.快速排序也使用D&C
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
-
快速排序的工作原理
- 首先从数组中选择一个元素,这个元素称为基准值
- 接下来找出比基准值小的元素以及比基准值大的元素,这被称为分区
- 只是进行分区,得到的两个子数组是无序的
- 对两个子数组进行快速排序
-
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)}\)快得多