1. 程式人生 > 實用技巧 >快排

快排

思想:

對於給定的記錄,選擇一個基準數,通過一趟排序後,將原序列分為兩部分,使得前面的比後面的小,然後再依次對前後進行拆分進行快速排序,遞迴該過程

在R[low:high]中選定一個元素R[pivot],以此為標準將要排序的序列劃分為兩個序列R[low:pivot-1]與R[pivot+1:high],並使序列R[low:pivot-1]中所有元素的值小於等於R[pivot],序列R[pivot+1:high]所有的值大於R[pivot],此時基準元素以位於正確位置,它無需參加後續排序

解析:

1.初始化:i=low,j=high  p = 7
 i                  j
[7, 3, 12, 5, 9, 1, 8]

2.從後往前找小於等於p的數,找到l[j]=1
 i               j
[7, 3, 12, 5, 9, 1, 8]

交換
    i            j  
[1, 3, 12, 5, 9, 7, 8]

3.從前往後找大於p的數
        i        j
[1, 3, 12, 5, 9, 7, 8]

交換
       i         j
[1, 3, 7, 5, 9, 12, 8]

4.從後往前找小於等於p的數
       i  j 
[1, 3, 7, 5, 9, 12, 8]

交換
       i  j
[1, 3, 5, 7, 9, 12, 8]

即:
low      mid        high 
[1, 3, 5, 7, 9, 12, 8]
原序列一分為二,左子序列為(1,3, 5)元素都比p小,右子序列為(9, 12, 8)元素都比p大


l = [7, 3, 12, 5, 9, 1, 8]
def fun(l,i,j):
    if i>=j:
        return l
    low = i
    high = j
    p = l[i]
    while i<j:
        if p <= l[j]:
            j -= 1
        l[i] = l[j]
        if p >= l[i]:
            i += 1
        l[j] = l[i]
    l[j] = p
    fun(l,low,i-1)
    fun(l,i+1,high)
    return l

參考文件:https://zhuanlan.zhihu.com/p/63227573