2016-10-10 44 views
0

嘗試創建插入排序但收到錯誤...插入排序不工作 - 列表索引超出範圍

不知道爲什麼會發生這種情況。它總是傾向於錯過37藏漢

numbers = [45,56,37,79,46,18,90,81,50] 

def insertionSort(items): 
    Tsorted = [] 
    Tsorted.append(items[0]) 
    items.remove(items[0]) 
    for i in range(0,len(items)): 
     print (Tsorted) 
     if items[i] > Tsorted[len(Tsorted)-1]: 
      Tsorted.append(items[i]) 
     else: 
      Tsorted[len(Tsorted)-2] = items[i] 
     items.remove(items[i]) 

insertionSort(numbers) 

錯誤:

if items[i] > Tsorted[len(Tsorted)-1]: 
IndexError: list index out of range 
+0

這些與您的錯誤無關。這已經在答案中解釋了,但我想補充一句,'Tsorted.append(items.pop(items [0]))'等於你在這兩行中做的事情。此外,'Tsorted [-1]'會給你與'Tsorted [len(Tsorted)-1]'相同的結果 – Lafexlos

回答

1

第一件事:你去除,你是這裏的循環中遍歷數組的項目:items.remove(items[i])。這通常不是一個好主意。

二:這種算法沒有實現插入排序,即使你修復缺失的問題。您應該查看算法,例如這裏Insertion sort in Wikipedia。 Thre是找到合適的插入位置所需的另一個循環。

第三:在其他情況下,您將覆蓋而不是插入值。

0

您要刪除在循環的過程中,從items元素;因此,i可能會成爲原始items中的有效索引值,但不再縮寫。

如果您需要從items刪除元素,它看起來像你應該等到循環結束。

0

那是因爲你打電話tems.remove()。當我= 4和items=[37, 46, 90, 50]時,您的代碼失敗。

所以他們已經沒有任何一種元素與索引43因爲索引以0

0

range(0,len(items)將只計算第一次你的代碼打開始的for循環,在此狀態len(list) = 8。這意味着你將會迭代

for i in [0,1,2,3,4,5,6,7] 
    #Do stuff... 

但是在同一時間你從每個循環的列表中刪除項目。所以打我= 4時,你有你的迭代循環4次,你的長度item -list只有4,這意味着items[4] 不再存在。