2012-03-26 28 views
0

我創建了一個排序函數,用於排序整數列表,從最高到最低。 下面是代碼:Python中自定義排序函數的錯誤結果

def sort(list): 
    s = [] 
    dropnum = 0 
    l = len(list) - 1 
    counter = 0 
    s.append(list[0]) 
    while 1: 
     maximum = len(s) 
     if counter == l: 
      break 
     if list[counter] < s[dropnum]: 
      dropnum = dropnum + 1 
     else: 
      counter = counter + 1 
      if dropnum >= maximum: 
       a.append(list[counter]) 
      else: 
       s.insert(dropnum, list[counter]) 
      dropnum = 0 
    return s 
print sort([70,9,24,82,102]) 

我應該得到的輸出:

[102,82,70,24,9] 

,但我得到:

[102, 82, 24, 9, 70] 
+1

爲什麼不使用'reverse(sorted(list))'?此外,你不應該命名你的變量列表,因爲有一個名爲list的內建函數。如果這是作業,請將其標記爲家庭作業。 – forivall 2012-03-26 00:07:26

+0

爲什麼你要重新實現'sorted()'?這是功課嗎? – Amber 2012-03-26 00:07:40

+4

那麼,在'if dropnum> = maximum:'之後你確實有'a.append()'而不是's.append'。另外,使用'list'作爲變量名通常是一個壞主意,因爲它是Python中的內置對象。 – Marius 2012-03-26 00:11:17

回答

1

正如我相信你已經知道了,python的內置sorted()是更有效的排序方式。

print sorted([70,9,24,82,102], reverse=True) 

假設這是一個學習的過程,我認爲這是你正在嘗試做

def sort(lst): 
    s = [] 
    for item in lst: 
     dropnum = 0 
     while dropnum < len(s) and s[dropnum] > item: 
      dropnum += 1 
     s.insert(dropnum, item) 
    return s 
print sort([70,9,24,82,102]) 

你並不需要一個計數器變量在所有如果您遍歷列表中的普通的Python方式

for item in lst: # loop through the items in the input 
+0

@agf,很對,固定 – 2012-03-26 01:51:08

0

你有一對夫婦更容易選擇內置到Python:

list.sort(...) # in-place, more memory efficient 

和:

sorted(my_iterable, ...) # returns a new copy 

而這兩種可選帶一個布爾reverse標誌,定製cmp比較函數和key定義排序上

什麼成員,我相信,這兩個使用快速排序實現的一個變化在內部(對於大型集合,對於較小的集合更簡單的迭代算法)。對於Python 2.3或更高版本,確保穩定。

此外,由於您污染了當前範圍中的名稱空間,因此不應將與參數或變量名稱相同的參數或變量命名爲內置函數或類型(例如list)。