一、快速排序思想
与归并排序类似,快速排序同样使用了分治思想:
二、快速排序算法分解:数组A[ p..r ]被划分成2个可能为空的子数组A[p..q-1]和A[q+1..r]使得A[p..q-1]中的所有的元素都小于等于A[q]而且A[q+1..r]中的所有元素都大于等于A[q]
计算下标 q 也是过程的一部分
解决:递归的调用快速排序对子数组进行排序
合并:快速排序是原址的,不需要合并操作
快速排序(A,p,r)
if(p<r)
q = 划分(A,p,r)
快速排序(A,p,q - 1)
快速排序(A,q + 1,r)
快速排序的核心在于 划分 例程:
划分总是选择一个主元,这里选择数组最后一个元素A[ r ],划分的目标是找到主元最终应该在序列中的什么位置才能使主元左边的元素都小于或等于主元,而主元右边的元素都大于或等于主元。在这个位置还没有确定出来之前,它总是有一个假定的位置,称为虚轴
划分(A,p,r)
x = A[ r ] //选定主元
i = p - 1 //虚轴 = i + 1,开始的时候,还没有找到一个比主元小的元素,虚轴为最小序列号 p
for j = p .. r-1 step = 1
if A[ j ] <= x //找到一个比主元小的元素,虚轴(i + 1)应该右移一个元素(+ 1),在虚轴左边腾好一个位置A[i + 1],好把A[j] 放进去
i = i + 1 //i 代表虚轴左边的首个位置,所以 i + 1 等价于虚轴 + 1
交换A[ i ] 与 A[ j ] //A[ j ]之前肯定没有找到小于或等于主元x的元素,而且 i <= j,故A[ i ]定大于x,放心交换
交换A[i + 1] 与 A[ r ] //循环结束时,最后一个小于或等于主元x的元素A[i]已经完成交换,虚轴 = i + 1就应该是主元x=A[r]的位置
return i + 1
快速排序在最坏情况下的复杂度为O(n^2),但它的期望时间复杂度为O(nlgn),它实际上被认为是实际排序应用中最好的选择。