运用了分治思想,三步分治过程
分解:数组A[p...r]被划分为两个子数组A[p...q-1]和A[q+1...r],其中左边数组元素都小于A[q],右边数组都大于A[q]
解决:通过递归调用快速排序,对子数组
A[p...q-1]和A[q+1...r]进行排序
合并:不需要合并操作
quicksort(A, p, r)
q = PARTITION(A, p, r)
quicksort(A, p, q-1)
quicksort(A, q+1, r)
PARTITION,即数组的划分是关键步骤
PARTITIN(A, p, r)
x = A[r]
i = p - 1
for j =
p
to
r-1
if(A[j] <= x)
i = i + 1
exchange A[i] with A[j]
exchange A[i+1] with A[r]
return i + 1
即主元的位置
i 保留了左边数组最靠右的位置(因此遇到比主元A[r]小的,i要自加,同时将比主元A[r]小的元素值交换到该位置);j则是遍历数组的位置;
时间复杂度分析:如果每一层都出现最坏情况的划分,则时间复杂度为O(n^2);其他情况都为O(nlg n)