排序算法之快速排序------算法分析
对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为Θ(n 2) 的排序算法,然而快速排序通常是实际排序中最好的选择,因为它的平均性能非常好,它的期望时间复杂度为Θ(nlgn),而且实际Θ(nlgn)中隐含的常数因子非常小,另外该算法是原址排序,很好地节省了内存空间。快速排序算法的运行情况比较复杂,与归并排序一样,快速排序也运用了分治思想,下面是对数组A[p,r]进行排序的三步分治过程。
分解:A[p,r]为两个可能为空的数组A[p,q-1],A[q+1,r],使得A[p,q-1]中的每一个元素都小于等于A[q],A[q+1,r]中的每一个元素都大于A[q],其中找到A[q]也属于划分过程。
解决:通过递归调用快速排序,对子数组A[p,q-1]和A[q+1,r]进行排序。
合并:因为是原址排序,所以当递归过程结束后数组已经完成排序,不需要合并。
下面为程序实现快速排序
QUICKSORT(A,p,r)
if(p<r)
q=PARTINTION(A,p,r)
QUICKSORT(A,p,q-1)
QUICKSORT(A,q+1,r)
return A
其中划分子过程的代码如下,这是快速排序算法的核心。
PARTINTION(A,p,r)
i=p-1
for j=p to r-1
if A[j]<=A[r]
i=i+1
exchangeA[j] with A[i]
exchange A[i+1] with A[r]
return i+1
在以上的划分子过程PARTINTION中,我们把A[p,r]划分为四个部分,第一部分A[p,i]这部分的元素值都小于等于A[r],第二部分为A[i+1,j-1],这部分的元素值都大于A[r],第三个部分为A[j,r-1]这部分的元素大小与A[r]的关系不能确定,第四部分为A[r]作为参照主元。
划分子过程结束时四个部分变为三个部分,同时将主元的值置换到中间,并返回下标作为q的值。下面以数组2,8,7,1,3,5,6,4的PARTINTION执行过程给出了一个例子
执行完成后返回的下标值为4所在的位置,同时以4为分界。将数组划分成了3个部分。在递归执行QUICKSORT的过程中,完成了原址排序。