[英]QuickSort Python In-place index out of bounds error
只是編寫一個quickSort算法,我似乎無法擺脫索引超出范圍錯誤或無限循環的麻煩。 有人能指出我正確的方向嗎? 提前致謝!
def quickSort(lst):
if len(lst) <= 1:
return lst
while len(lst) > 1:
pivot = part(lst)
quickSort(lst[ :pivot])
quickSort(lst[pivot+1: ])
return lst
def part(a):
x = a[0]
i = 1
j = len(a)-1
while (i <= j):
while (i <= j) and (a[j] >= x):
j -= 1
while (i <= j) and (a[i] < x):
i += 1
if (i <= j) and a[i] > a[j]:
temp = a[i]
a[i] = a[j]
a[j] = temp
a[i], a[0] = a[0], a[i]
return i
while (i <= j) and (a[i] < x):
i += 1
當i = j
且j
設置為len - 1
, i+=1
將使其超出范圍。
在跳轉和調試代碼之前,您必須了解quicksort背后的思想。 很容易理解是什么原因導致“代碼錯誤” IndexOutOfBound
,但對於“邏輯錯誤”卻並非如此
快速排序算法的關鍵是分區。 在分區中,通常將一個支點作為比較點。 在您的情況下,您選擇索引0作為樞軸。 現在假設您在陣列中有3個邏輯分區。
index: 0
) index: 1..i
) index: i..j
) index: j..n-1
數字( index: j..n-1
) 您現在的目標是將分區3中的每個數字都放入分區1或2中。然后,由於分區3將被清空,因此我們剩下2個分區。 將數據透視圖與分區1的最后一個元素交換。然后,您具有以下Partition 1 < Pivot < Partition 2
接下來,我們在Quicksort方法中處理“分而治之”技術。在這種方法中,您不必迭代分區。 取而代之的是,您只需要再次遞歸調用兩個新分區中的每個分區的Quicksort,該分區已被中間的樞軸拆分了。
這種快速排序只能通過分為兩部分進行排序的原因是,每當它們進行分區時,樞軸實際上就在數組的排序索引中。
Web上有許多Quicksort的實現。 不要因為看它們而感到困惑。 基本上,想法是一樣的。 (2個具有樞軸排序的分區)。 有些實際上是從左到右實現分區,而有些實際上是從右到左。 在您的情況下,您似乎將兩個方向混合在一起。 這樣i
走到右邊,而j
走到左邊。 因此,在執行此操作時,只需注意此邊界,尤其是在交換期間。
過去,我寫了Quicksort算法,在分區方法中有一個迭代循環(因為在處理邊緣情況時更容易理解),在quicksort算法中有兩個遞歸調用。
希望對你有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.