算法导论第七章--快速排序

快速排序的描述

简介

对于一个包含n个输入数的数组来说,快速排序是一种最坏情况下复杂度高达Θ(n^2)的排序算法,虽然最坏情况下复杂度很高,但平均性能很好,而且是通常情况下最优的排序算法,期望复杂度为Θ(nlgn),且常数很小,而且算法可以进行原址排序,甚至在虚存中也表现良好.

描述

快速排序运用了分治思想,主要使用了以下三步主要内容.

1. 分解

数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]A[q+1..r],使得
A[p..q—1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1..r]中的每个元素。

2.解决

通过递归调用快速排序,对A[p..q-1]A[q+1..r]进行快速排序

3.合并

因为子数组都是原址操作,所以不需要合并,分解后自然有序

数组的划分

python描述

def partition(A,p,r):#为数组A[p..r]
    x = A[r]#选末尾为pivot
    i = p-1
    for j in range(p,r):
        if A[j]<=x:
            i+=1#将i的区域向后延申,并于j交换
            A[i],A[j] = A[j],A[i]
    A[i+1],A[r] = A[r],A[i+1]
划分实例

证明

即数组永远满足以下三个条件

  1. A[p...i]中的数据≤X
  2. A[i+1..j-1]中的数据>X
  3. A[r]=x

当变量初始化时

j = p,i = p-1,x=a[r]
p>i,条件1满足
i+1>j-1,条件2满足
显然,条件3满足

算法运行过程中

已有A[i+1..j-1]>X,当A[j]>X时,j++,因此继续满足A[i+1..j-1]>X
A[j]<=X时,i++交换A[i]A[j],由上可知A[i+1]>X,故交换后A[j]>X,j++,故满足A[i+1..j-1]>X
当算法运行

终止

交换A[i+1]和$A[r],完成划分

快速排序的性能

快速排序的运行时间取决于划分是否平衡,划分平衡时,快速排序性能基本和归并排序一样,否则,性能接近于插入排序.

最坏情况划分

当划分后的两个子问题分别为n-1个元素和0个元素时,就出现了最坏情况.不妨假设每次排序都出现了最坏情况,划分操作的时间复杂度为Θ(n)
那么递归表达式为T(n) = T(n-1)+Θ(n)
解为T(n)=Θ(n^2)
.....未完待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容