2014-02-24 259 views
-3

下面爲quicksort編寫的代碼沒有正確排序列表。代碼中必然存在一些邏輯缺陷。任何人都可以查看代碼嗎?python中的快速排序

def quicksort(aList, start, last): 
    i = start + 1 
    j = start + 1 
    pivot = aList[start] 
    while j <= last and pivot > aList[j]: 
     if pivot > aList[j]: 
      temp = aList[i] 
      aList[i] = aList[j] 
      aList[j] = temp 
      i = i + 1 
     j = j + 1 

    temp = aList[start] 
    aList[start] = aList[i-1] 
    aList[i-1] = temp 
    if i - start > 2: 
     quicksort(aList, start, i-2) 
    if last - i > 0: 
     quicksort(aList, i, last) 


aList = [2, 5, 3, 95, 68, 75, 29, 52] 
quicksort(aList, 0, len(aList)-1) 
print aList 
+3

請告訴我們什麼是錯的。你期望什麼,你的代碼的結果是什麼? – 2014-02-24 11:15:31

+1

這裏有一個提示可以幫助你找出錯誤的地方:在說'temp = aList [start]' – mbatchkarov

+1

的行之前加上'print aList'另外,看看[PEP-8(Python代碼樣式指南) ](http://www.python.org/dev/peps/pep-0008/) - 不要使用製表符縮進 - 每個級別使用四個空格。在運算符周圍使用空格。避免不必要的括號。並且瞭解元組打包和解包:'alist [i],alist [j] = alist [j],alist [i]'更酷。 –

回答

1
def quicksort(aList, start, last): 
    i = start + 1 
    j = start + 1 
    pivot = aList[start] 
    while j <= last: 
    if pivot > aList[j]: 
     temp = aList[i] 
     aList[i] = aList[j] 
     aList[j] = temp 
     i = i + 1 
    j = j + 1 

    temp = aList[start] 
    aList[start] = aList[i-1] 
    aList[i-1] = temp 
    if i - start > 2: 
    quicksort(aList, start, i-2) 
    if last - i > 0: 
    quicksort(aList, i, last) 

試試這個!

yopy給出了另一個版本的快速排序。

快速排序的關鍵是選擇樞軸,在你的代碼中樞軸是數組的第一個元素,爲了獲得更好的平均性能,你可以隨機選擇樞軸。

0

請檢查:

def quicksort(aList, start, last): 
    i = start + 1 
    j = last 
    pivot = aList[start] 
    while i <= j: 
     if pivot > aList[j]: 
      aList[i], aList[j] = aList[j], aList[i] 
      i = i + 1 
     elif pivot < aList[j]: 
      j = j - 1 

    aList[start], aList[i-1] = aList[i-1], aList[start] 

    if i - start > 2: 
     quicksort(aList, start, i-2) 
    if last - i > 0: 
     quicksort(aList, i, last) 


aList = [2, 5, 3, 95, 68, 75, 29, 52] 
quicksort(aList, 0, len(aList)-1) 
print aList 

輸出:

[2, 3, 5, 29, 52, 68, 75, 95] 
+0

這工作..雖然我用了不同的邏輯。我和j都增量增長,不像ur的代碼,j減少,我增加.. – Arighna

+0

爲什麼在'i <= j'循環內檢查if語句中的'i <= j?它看起來總是會變成真實的,或者我錯過了什麼? – alexwlchan

+0

刪除謝謝,它是多餘的。我正在修復該片段,並忘記將其刪除。 –