實現公升序排序的 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 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...