Quick Sort - 快速排序
问题
用Quick Sort对长度为的无序序列从小到大(升序)排序。
解法
在长度为的序列选取最左边元素作为,然后将剩余部分分为两个部分和(其中),满足所有元素都位于左边,小于等于,所有元素都位于右边,大于等于,而内部并不必须是有序的。如图:
将中任意移动到其左边,任意移动到其右边。需要如下操作:
function Partition(s, low, high):
let pivot = s[low]
while low < high
while low < high and s[high] >= pivot
high--
s[low] = s[high]
while low < high and s[low] <= pivot
low++
s[high] = s[low]
s[low] = pivot
return low
(1) Partition函数第2行:令第一个元素作为;
(2) Partition函数第3-9行:轮流从最右边选出第一个移动到其左边,从最左边选出第一个移动到其右边,直到;
(3) Partition函数第10-11行:经过移动之后的位置即为最终的位置,将该位置返回给函数调用者;
上述操作的示例如图:
设。从向左搜索第一个,令。
再从开始向右搜索第一个,令。
再从向左搜索第一个,令。
上述操作直到停止,此时的位置即为的位置,令就完成了本轮操作。
递归的对和进行该操作,即可完成整个数组排序:
function QuickSort(s, begin, end):
if end <= begin+1
return
let mid = Partition(s, begin, end)
QuickSort(s, begin, mid)
QuickSort(s, mid+1, end)
复杂度
设,则Partition函数的输入规模为,其时间复杂度为。
QuickSort函数的初始输入规模为,调用Partition的输入规模为,每次递归后输入规模为上一层的,可得:
类似MergeSort算法,该算法的时间复杂度为,因为所有操作都没有申请额外内存,是在原地完成,因此空间复杂度为。