雙指標法來實現快速排序
經過這樣處理後,這個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小的數字,...