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函數不需要知道數組的長度,是從頭到尾遍歷過去的,因此也可以用於鏈表的快排:鏈表的快排和歸併排序