快排的兩種partition函數

partition函數就是快排的關鍵部分,作用是將數組劃分成兩部分,左邊小於基數,右邊大於基數

但實際上它也不僅僅用於快排,在求top(K)問題中也常常會用到。

下面介紹兩種partition函數,他們都是雙指針的方法,但具體會有差異:

函數一:頭尾指針向中間夾

def partition(array,left,right):
    baseNumber = array[left]	# 基數的位置也可以隨機取,避免有序列表導致最壞的複雜度
    while left<right:
        while left < right and baseNumber <= array[right]:
            right -= 1
        array[left] = array[right]	# 這一步之後不用再 left += 1,因爲下面的循環第一次肯定滿足
        while left < right and baseNumber >= array[left]:
            left += 1
        array[right] = array[left]
    array[left] = baseNumber
    return left

函數二:雙指針都從頭開始

第二種partitition函數,也是雙指針,但都是從頭開始,一個佔坑(記錄下一個要替換的位置),一個遍歷,同樣要選擇基準值,實際上也可以以任何一個元素作爲基準值,下面以第一個元素作爲基準值:

def partition(array, left, right):
    baseNumber = array[left]
    x = left
    for y in range(left, right):
        if array[y]<baseNumber:
            x+=1
            array[x], array[y] = array[y],array[x]
    array[x], array[left] = array[left], array[x]
    return x

def quich_sort(a, left, right):
    if left<right:
        index = partitionA(a, left, right)
        quich_sort(a,left, index-1)
        quich_sort(a, index+1, right)

a=[4,1,3,2,-3,6]
quich_sort(a, 0, len(a))
print(a)

這個partition函數不需要知道數組的長度,是從頭到尾遍歷過去的,因此也可以用於鏈表的快排:鏈表的快排和歸併排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章