2016-10-10 5 views
0

Попытка создать вставку рода, но получаю ошибку ...Вставка сортировки не работает - индекс списка из диапазона

Не знаю, почему это происходит. Он всегда имеет тенденцию пропустить 37 Aswell

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(). Ваш код выходит из строя, когда i = 4 и items=[37, 46, 90, 50].

Так что они уже не элемент с индексом 4 но с 3 поскольку индексация начинается с 0.

0

range(0,len(items) будет рассчитываться только в первый раз, когда ваш код попадает ваш для цикла, при котором состояние len(list) = 8. Это означает, что вы повторите итерацию

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

Но в то же время вы удаляете элементы из своего списка в каждом цикле. Поэтому, когда вы нажимаете i = 4, вы повторяли свой цикл 4 раза, а длина вашего item -list - всего 4, что означает, что items[4] больше не существует.