算法导论第七章快速排序

快速排序的描述

简介

对于一个包含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)\)
.....未完待续

原文地址:https://www.cnblogs.com/alex101/p/13999268.html