簡體   English   中英

實施QuickSort時遇到困難

[英]Having difficulty in implementing QuickSort

我已經嘗試實施quicksort大約2天了(看起來我的編程技能正在生銹)。 我不知道我在做什么錯。 我將要放棄,所以我認為我應該去咨詢論壇。

這是我試圖在python中實現的代碼。 但這並沒有給出預期的結果。 任何人都可以指出我做錯了什么嗎?

def QuickSort(A,p,r):

if p < r:
    pivotIndex = Partition(A,p,r)
    QuickSort(A,p,pivotIndex-1)
    QuickSort(A,pivotIndex+1,r)
    return A
def Partition(A,p,r):

m = A[p]
i = p+1
for j in range( p+1 , r ):
    if A[j] < m:
        A[j] , A[i] = A[i] , A[j]
        i+=1
A[p], A[i-1] = A[i-1] , A[p]
return i-1

測試輸入的輸出為:

>>>QuickSort([9,8,7,6,5,4,3,2,1],0,9)
[1, 3, 5, 6, 7, 4, 8, 2, 9]

如果有人幫助我實現這一目標,我將非常感激。

問候

切片不會返回原始列表的視圖; 它會根據舊列表中的數據創建一個新列表。 這意味着對QuickSort的遞歸調用不會更改原始列表。

您可以在一行代碼中嘗試此實現:

def QuickSort(list):
    return [] if list==[]  else QuickSort([x for x in list[1:] if x < list[0]]) + [list[0]] + QuickSort([x for x in list[1:] if x >= list[0]])

print QuickSort([9,8,7,6,5,4,3,2,1])

我已經找到答案了。 看來我正在將一分之一傳遞給QuickSort方法

def QuickSort(A,p,r):
    if r-p <= 1: return
    pivotIndex = Partition(A,p,r)
    QuickSort(A,p,pivotIndex)
    QuickSort(A,pivotIndex+1,r)
    return A
def Partition(A,p,r):

    m = A[p]
    i = p+1

    for j in range( p+1 , r ):
        if A[j] < m:
            A[j] , A[i] = A[i] , A[j]
        i= i + 1
    A[p], A[i-1] = A[i-1] , A[p]
    return i-1

這是正確的實現

看來您想將樞軸保持在左側並跳過它,但是效果不佳,所以我只是將其移到數組的末尾並相應地減少了迭代索引,然后反轉了后分區交換(考慮樞軸運動)。

def Partition(A,p,r):

  m = A[p]
  A[p], A[r] = A[r], A[p]
  i = p
  for j in range( p, r ):
    if A[j] < m:
        A[j] , A[i] = A[i] , A[j]
        i+=1
  A[r], A[i] = A[i] , A[r]
  return i

我認為您可以使用左側的樞軸來完成此操作,但是我猜您必須更改循環方向,但是我不確定。

編輯:對不起我忘了補充呼叫然后快速排序([9,8,7,6,5,4,3,2,1],0,8)時,由於索引現在是包含性的。

暫無
暫無

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

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