快速排序 Quick Sort 的 思維過程

2021-10-09 00:19:03 字數 1448 閱讀 5558

實現公升序排序的 python **

def

sort

(nums)

: quit_sort(nums,0,

len(nums)-1

)return nums

defquit_sort

(nums, l, r)

:if r <= l:

return

# 現在左右兩邊找到分割點,使得分割點左邊都比較小,分割點右邊都比較大

j = partition(nums, l, r)

quit_sort(nums, l, j -1)

quit_sort(nums, j +

1, r)

defpartition

(nums, l, r)

: i = l +

1 j = r

v = nums[l]

while

true

:# 向右遍歷,找到大於 v 的值索引,需要排除等於的情況

while nums[i]

<= v:

i +=

1if i == r:

break

# 向左遍歷,找到 小於 v 的值的索引,需要排除等於的情況

while v < nums[j]

: j -=

1if j == l:

break

# 如果相遇過,則退出

if i >= j:

break

# 否則交換

nums[i]

, nums[j]

= nums[j]

, nums[i]

# 最後把 對比元素 v 放在 j 的位置上。q:為什麼不放在 i 的位置上

# 因為 j 指向小於 v 的位置,根據 左小右大 的原則,把 v 放在 j 的位置更好

nums[l]

, nums[j]

= nums[j]

, nums[l]

return j

雙指標的滑動邏輯和過程

選取第乙個元素 v 作為基準,i

ii 從左向右滑動,直到找到大於 v 的位置,j

jj 從右向左滑動,直到找到 小於 v 的位置,如果此時 i

ii 和 j

jj 還未相遇,則交換兩者的值,然後 i

ii 繼續尋找下乙個大於 v 的位置,j 繼續尋找下乙個小於 v 的位置, 當 i

ii 和 j

jj 相遇後,即 i≥j

i \geq j

i≥j 時,則停止,此時 j

jj 指向了小於 v 的位置,而我們做的是公升序排序,所以 v 和 j 指向的位置的值進行交換,能把更小的值放在前面。完成這一階段的排序。此時 v 已經在他正確的位置了,因為左邊的值都比他小,右邊的值都比他大,最後以 j 為分割點,遞迴排序左邊和右邊即可完成整個陣列的排序

快速排序 QuickSort

快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...

快速排序 quicksort

快速排序 quicksort 是分治法的典型例子,它的主要思想是將乙個待排序的陣列以陣列的某乙個元素x為軸,使這個軸的左側元素都比x大,而右側元素都比x小 從大到小排序 然後以這個x在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有乙個元素為止。快速排序演算法如下 void...

快速排序 QuickSort

1,void quicksort int a,int low,int high 這個函式是排序的遞迴部分,mid就是已經確定的基準元素的位置。2,int partition int a,int low,int high 這個函式幹了兩件事 1 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...