Python雙指標法,快速排序,這次不要再忘了

2021-10-20 02:49:07 字數 1777 閱讀 3880

雙指標法來實現快速排序

經過這樣處理後,這個pivot位置就不動了,所在位置就是它最後排好序的位置了。再分別遞迴處理pivot左邊和右邊的部分。

指標移動肯定是用while語句了。那麼每次左指標和右指標,誰先出發?

例子:選最左端元素5為pivot,應該右指標先出發。左右指標停在元素4的位置,交換4和5,pivot即5被移動到了正確的位置。倘若左指標先出發,左右指標會停在6的位置,此時若交換,6就跑到5的左邊了,顯然錯誤。

[5,

1,2,

3,4,

6,7,

8,9]

分函式寫,這個函式的功能是:將pivot交換到正確的位置,並且返回pivot交換後的位置,便於之後遞迴。

def

partition

(lst, left, right)

: start = right

pivot = lst[start]

while left != right:

#只要大的,小於等於的都略過

while

(left < right and lst[left]

<= pivot)

: left +=

1#只要小的,大於等於的都略過

while

(left < right and lst[right]

>= pivot)

: right -=

1 lst[left]

, lst[right]

= lst[right]

, lst[left]

lst[start]

, lst[left]

= lst[left]

, lst[start]

return left

pivot要是選取左邊,**就應該這樣寫:

def

partition

(lst, left, right)

: start = left

pivot = lst[start]

while left != right:

#只要小的,大於等於的都略過

while

(left < right and lst[right]

>= pivot)

: right -=

1#只要大的,小於等於的都略過

while

(left < right and lst[left]

<= pivot)

: left +=

1 lst[left]

, lst[right]

= lst[right]

, lst[left]

lst[start]

, lst[left]

= lst[left]

, lst[start]

return left

快排的遞迴部分:

def

kuaisu

(lst, left, right)

:if left >= right:

#大於也行

return

q = partition(lst, left, right)

kuaisu(lst, left, q -1)

kuaisu(lst, q +

1, right)

快速排序 前後指標法)

之前的兩篇中,為大家介紹了霍爾劃分和挖坑法劃分,這一篇,我們來看看第三種劃分方法 前後指標法。顧名思義,需要兩個指標,乙個在前乙個在後,分別用cur表示前指標,prev表示後指標 這裡的指標的意思是待排序數列的下標 依舊是這個圖,初始時,我們規定cur在prev的後乙個位置,這裡我們還是選擇第乙個數...

排序 快速排序(前後指標法)

時間複雜度 最壞 o n 2 不會出現 最好 o nlogn 平均 o nlogn 空間複雜度 o logn 函式呼叫棧,極端情況 o n 不會出現 穩定性 不穩定 資料敏感 敏感 include 公升序 void swap int array,int i,int j 三數取中 這麼做是為了防止資料...

快速排序演算法 挖坑法 左右指標法 快慢指標法)

挖坑法,可以理解成拆東牆補西牆。這裡以陣列 4,1,7,6,9,2,8,0,3,5 為例子講解。以資料第乙個元素作為樞軸 也可以是最後乙個,看你喜好 這裡我們先把作為樞軸的4摳出來單獨放置,此時陣列變成了 口,1,7,6,9,2,8,0,3,5 這時我們要從陣列尾部開始往前找,找第乙個比4小的數字,...