[英]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.