2014-05-20 80 views
-1

我對Quicksort算法有下面的python代碼。該代碼工作正常,直到所有元素的權利的樞紐大於樞紐,在這種情況下,這些仍然未排序。Quicksort的Python實現無法對整個數組進行排序

理論上的代碼應該在陣列中的所有元素進行排序,但在這個階段,我不知道我失蹤

def swap(array, i, j): 
    temp = array[i] 
    array[i] = array[j] 
    array[j] = temp 

def choosePivotFirstElement(array, left, right): 
    return left 

def partition(array, pivotIndex, left, right): 
     swap(array, pivotIndex, left) #put pivot to the left 
     pivot = array[left] 
     i = left + 1 

    for j in range(left+1, right+1): 
      if (array[j] < pivot): 
        swap(array, i, j) 
        i = i + 1 
    swap(array, left, i-1) #put pivot back to its place 
    return (i-1) #return the position of the pivot 

def qsort(array, left, right): 
     if ((right - left) < 2): 
      return 

     pivotIndex = choosePivotFirstElement(array, left, right) 
     split = partition(array, pivotIndex, left, right) 

     qsort(array, left, split) 
     qsort(array, split + 1, right) 
     return array 

myList = [7,2,5,1,29,6,4,19,11] 
sorted = qsort(myList,0,len(myList)-1) 
print sorted 

,應返回

[1,2,4,5 ,6,7,11,19,29]

而是返回

[1,2,4,5,6,7,29,19,11]

我是python的新手,所以我可能會犯一個相當明顯的錯誤。

+3

'qsort'沒有返回任何東西......它似乎在原地排序。你的'print'語句是不是顯示'None'? – Cameron

+1

你確定這個'((右 - 左)<2)'條件嗎?乍一看它看起來會阻止你的排序工作,比如'qsort([1,0],0,1)' – njzk2

+1

另外,在python中的交換可以通過'x [i],x [j] = x [j],x [i]'其中'x'是你的列表。 –

回答

1

你的代碼看起來不像一個python代碼,你仍然試圖從某種東西轉換爲python,這不是一個好主意。

通常你有這樣的事情在Python:

def quickSort(arr): 
    #Leftside 
    less = [] 
    #pivot 
    pivotList = [] 
    #rightside 
    more = [] 
    #if the length of the array is one. then, there is no point in sorting it 
    if len(arr) <= 1: 
     return arr 
    else: 
    #sorting :) 
     #Defines the pivot as the first element 
     pivot = arr[0] 
     for i in arr: 
      #for each element in the array verify: 
      if i < pivot: 
       less.append(i) 
      elif i > pivot: 
       more.append(i) 
      else: 
       pivotList.append(i) 
     #Define the Lists less (left side) and more (right side) 
     less = quickSort(less) 
     more = quickSort(more) 
     #Return the actual array 
     return less + pivotList + more 

a = [7, 2, 5, 1, 29, 6, 4, 19, 11] 
a = quickSort(a) 
print a 

編輯

有在代碼中幾個錯誤,因爲所指出的評論:

你應該沒有交換功能,因爲你可以做

array[i], array[j] = array[j], array[i] 

既然你沒有在這個例子中調用,選擇PivotLastElement或choosePivotMedianofThree,所以你不應該發佈它們。在其他問題中,您可以稍後詢問具體的事情。

發帖之前請先閱讀How to Create a Minimal, Complete and Verifiable Example

範圍應該是範圍(左+ 1,右+ 1):

而且我有一個印象是:

if ((right - left) < 2)應該像我在我的代碼中使用:if len(array) <= 1:

在代碼的後面你可以看到你沒有定義其他列表,而且你也不會返回任何東西。請再次查看我的代碼並嘗試理解它。你可能會問關於具體細節的問題,,但你真的應該試着去理解它。

+0

Kyllopardium一步一步來。你的代碼中有部分我不明白! :)但看起來非常好。無論如何,你能發現我的代碼錯誤嗎? (順便說一句,我忘記了qsort的「返回數組」) – Javier

+1

好的,我會繼續努力的。上面的代碼已經更新了(我對stackoverflow也是新的),因爲我立即注意到qsort沒有返回,有人告訴我關於python中range函數的獨有性質。事實是,從廣泛的意義上講,我會用扎子和代碼。但是,它使用不同於我的分區方法(有各種分區方法)。我應該使用的分區方法應該只在找到的元素小於主元時才起作用,如果不是「什麼也不做」。無論如何,我會保存你的代碼,稍後再看看。謝謝。 – Javier