簡體   English   中英

Python 3方式分區(Quicksort)

[英]Python 3 way partitioning (Quicksort)

我正在嘗試為3路分區編寫python代碼,但是出現索引錯誤。 我試圖修復它,但似乎沒有成功。 在我的代碼中,我選擇第一個條目作為樞軸,然后從左向右掃描,並在必要時交換值。 如果有任何項等於數據透視,則將其移至a的開頭或末尾(出現錯誤)。

這是我的代碼

def partition(a, start, end):
    left=start+1
    right=end
    p=start+1
    q=end
    pivot=a[start]
    while True:
        while a[left]<pivot:
            left+=1
        while a[right]>pivot:
            right-=1
            if right==start+1:
                break
        if left>=right:
            break
        swap(a[left], a[right])
        if a[left]==pivot:
            swap(a[p],a[left])
            p+=1
        if a[right]==pivot:
            swap(a[right], a[q])
            q-=1
    swap(a[right], a[start])
    k=end
    while k>=q+1:
        swap(a[left+1], a[k]) 
        k-=1
        left+=1
    k=1
    while k<p:
        swap(a[k], a[right+1])
        k+=1
        right-=1

我將交換定義為:

def swap(a, b):
    temp=a
    a=b
    b=temp

當我嘗試運行此功能時,在第21行出現錯誤,該索引超出范圍。 對這里有什么問題有什么建議嗎?

如問題評論中所述,代碼中的swap()函數不執行任何操作。 在Python中,名稱只是附加到對象的標簽。 如果分配名稱,則只需在對象上附加標簽。 將對象傳遞給函數時,將傳遞該對象,而不是分配給它的名稱。 函數內部的賦值只會為對象創建本地名稱,而在函數外部沒有任何可見的效果。

不過,您可以修改傳遞給函數的對象 swap()的以下實現將起作用:

def swap(a, i, j):
    a[i], a[j] = a[j], a[i]

它修改通過了作為列表a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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