快排的兩種partition函式

2021-09-26 16:34:30 字數 1522 閱讀 4250

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

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

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

函式一:頭尾指標向中間夾

def

partition

(array,left,right)

: basenumber = array[left]

# 基數的位置也可以隨機取,避免有序列表導致最壞的複雜度

while leftwhile 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]

x+=1 array[x]

, array[y]

= array[y]

,array[x]

array[x]

, array[left]

= array[left]

, array[x]

return x

defquich_sort

(a, left, right)

:if leftindex = 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函式不需要知道陣列的長度,是從頭到尾遍歷過去的,因此也可以用於鍊錶的快排:鍊錶的快排和歸併排序

快排的兩種寫法

快速排序,原理很簡單就是在資料找乙個定點數,把小於這個數的數放到其左邊,大於這個定點數的數放到其右邊,再把左邊的數,右邊的數再按這種方式來排序,直至無數可排.先實現,不求空間消耗,把小於定點的數放乙個陣列 b,把大於定點的數的放乙個陣列 c,再把它們拷回陣列 a int quick sort int...

排序 快排的兩種寫法

之前的部落格記錄過各種排序 快排演算法 如下,該方法思路很直接也很清晰,但是在生成left和right時會需要新的空間,所以其空間複雜度要高一些。def quick sort li if len li 2 return li tmp li 0 快排中將序列分為左右的值 left x for x in...

快排的java兩種實現方式

快排是最基礎的幾個排序演算法之一,今天再來回顧下 public class quicksort private static void quicksort int array,int beg,int end 上面就是快排主要的框架,最重要就是partition方法,它是劃分並找到下次分割排序的位置p...