簡體   English   中英

QuickSort Python就地索引超出范圍錯誤

[英]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 = jj設置為len - 1i+=1將使其超出范圍。

在跳轉和調試代碼之前,您必須了解quicksort背后的思想。 很容易理解是什么原因導致“代碼錯誤” IndexOutOfBound ,但對於“邏輯錯誤”卻並非如此

快速排序

快速排序算法的關鍵是分區。 在分區中,通常將一個支點作為比較點。 在您的情況下,您選擇索引0作為樞軸。 現在假設您在陣列中有3個邏輯分區。

  • 樞軸:任何數字( index: 0
  • 分區1:任何小於樞軸的數字。 index: 1..i
  • 分區2:大於樞軸的任何數字。 index: i..j
  • 分區3:未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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM