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...