Quick Sort - 快速排序


问题

用Quick Sort对长度为的无序序列从小到大(升序)排序。

解法

在长度为的序列选取最左边元素作为,然后将剩余部分分为两个部分(其中),满足所有元素都位于左边,小于等于所有元素都位于右边,大于等于,而内部并不必须是有序的。如图:

QuickSort4.png

中任意移动到其左边,任意移动到其右边。需要如下操作:

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行:经过移动之后的位置即为最终的位置,将该位置返回给函数调用者;

上述操作的示例如图:

QuickSort1.png

。从向左搜索第一个,令

QuickSort2.png

再从开始向右搜索第一个,令

QuickSort3.png

再从向左搜索第一个,令

上述操作直到停止,此时的位置即为的位置,令就完成了本轮操作。

递归的对进行该操作,即可完成整个数组排序:

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算法,该算法的时间复杂度为,因为所有操作都没有申请额外内存,是在原地完成,因此空间复杂度为

源码

QuickSort.h

QuickSort.cpp

测试

QuickSortTest.cpp