思想:
快速排序也是一种交换排序,本质思想都是通过交换序列中的反序,直到没有反序对为止。它采用了分治策略,是对冒泡排序的一种改进。
快速排序的思想如下:分解——把一个元素(如R1)移动到在排序后的文件中它的最终位置上,同时重新排列其他元素,使得不小于R1的元素都位于它的右边,不大于R1的元素都位于它的左边。通过划分,把原来的问题划分为两个子问题。解决——递归调用快速排序算法分别对左边和右边的序列进行排序。合并——空操作,什么也没做。
伪代码:
QuickSort(A,p,r)
If p<r
q=partition(A, p, r)
QuickSort(A, p, q-1)
QuickSort(A, q+1, r)
下面来看其中的partition算法。这个算法也有好几种不同的实现方式。大体可以分为单向划分和双向划分。
单向划分:设选中val作为基元素,A[1,..,i]中的所有元素都小于val,A[i+1,…,j]都大于等于val
Partition(A, p, r)
Val=A[r]
I = 0, j = 1;
While(j<r)
If(A[j] <= val)
i++
交换A[i]和A[j]
j++
交换A[r]和A[i+1]
双向划分:设val作为基元素,A[1,…,i]都小于等于val,A[j,…,r]都大于等于val
Partition(A, p, r)
Val = A[p]
I=p, j=r
While(I < j)
While(i<j 且 A[i] <= val)
i++
While(A[j] >= val)
j--
If(i < j)
交换A[i]和A[j]
i++
j--
算法分析:
快速排序的平均时间复杂度是O(nlgn),最坏时间复杂度是O(n^2)。比如:你要按照非降序排序,输入序列却是按照非升序排列的,如果在partition划分算法中,每次都选取第1个元素作为划分元素的话,那么将发生最坏情况。
快速排序的平均时间复杂度是所有排序中最好的。