数据结构与算法 10.快速排序 quickSort

快速排序 quickSort

取序列的第一个值作为基点,把序列中比基点小的数和比基点大的数分为两个子序列
把两个子序列分别作为新的序列,再次进行分堆,并不断递归,直至子序列无法再分堆
分堆时取出基点,使用两个指针,从序列的头尾分别向中间移动,移动过程把值与基点作比较
利用基点空出的位置,移动处于错误区域的元素,并利用新空出的位置移动新发现的处于错误区域的元素
需要消耗大量空间

复杂度:最优时间复杂度:O(nlogn)
        最差时间复杂度:O(n^2)
        稳定性:不稳定
def quick_sort(varlist,start,end) :
    # 结束递归的条件
    if start >= end :
        return

    # 取出作为基点的值
    mid = varlist[start]
    # 序列开头和末尾
    low = start
    high = end

    # 1.第一步:以基点值为界,将整个序列分为,小于基点值和大于基点值的两部分

    # 使用两个指针low和high,从序列开头和末尾分别向序列中间移动并取值,将取值与基点值作比较
    # low=high时,表示两个指针重叠,即完成了整个序列的比较和分堆,循环结束
    while low < high :

        # 对序列从后向前取值,若取值大于基点值,则继续向前移动high指针并取值
        while low < high and varlist[high] >= mid :
            high -= 1
        # 若取值小于基点值,则将取值移动到low指针所在位置,并开始移动low指针
        varlist[low] = varlist[high]

        # 对序列从前向后取值,若取值小于基点值,则继续向后移动low指针并取值
        while low < high and varlist[low] < mid :
            low += 1
        # 若取值大于基点值,则将取值移动到high指针所在位置,并开始移动high指针
        varlist[high] = varlist[low]

    # low指针与high指针位置重叠时,把基点值放入该位置
    varlist[low] = mid

    # 2.第二步:把完成分堆的两部分,分别作为一个需要排序的序列,调用自身进行递归

    quick_sort(varlist,start,low-1)
    quick_sort(varlist,high+1,end)

varl = [5,1,7,5,6,3,4,8,2,3,5,9]
quick_sort(varl,0,len(varl)-1)
print(varl)

[1, 2, 3, 3, 4, 5, 5, 5, 6, 7, 8, 9]
上一篇:快速排序 (Quick Sort)


下一篇:快速排序(lua实现)