SelectionSort в алгоритме Grokking

Я борюсь с фрагментом цикла for in range() в книге Grokking Algorithm SelectionSort

def findthesmallest(arr):
    # suppose that the left list is sorted
    min = arr[0]
    min_index = 0

    for i in range(len(arr)):
        if arr[i] < min:
            min = arr[i]
            min_index = i

    return min_index

def selectionsort(arr):
    new_arr = []
    # For each i+= 1, n-=1 
    for i in range (len(arr)):
        min_index = findthesmallest(arr)
        # Add item to new_arr and update the arr
        new_arr.append(arr.pop(min_index))

    return new_arr

print (selectionsort([5, 3, 4, 8, 10]))
  • Итак, во втором цикле for_loop selectionsort() каждый раз, когда мы заканчиваем итерацию, len(arr) - 1
  • в то время как i увеличивается с каждой итерацией, range(len(arr)) уменьшается.
  • когда я пытаюсь проверить каждый (i, len(arr)) каждой итерации, я получаю: (0,5), (1, 4), (2, 3), (3, 2), (4, 1)
  • Как возможно i = 4 в диапазоне (1)?

Заранее спасибо!


person DNguyen    schedule 26.10.2018    source источник


Ответы (1)


Если вы прочитаете документацию о for, вы увидите что

Список выражений оценивается один раз

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

Вам нужен какой-то другой способ перебора arr, возможно, цикл while. Или добавьте проверку, чтобы убедиться, что i не выходит за пределы.

person Some programmer dude    schedule 26.10.2018
comment
Спасибо за ответ. В то время как_loop определенно работает для меня. Я все еще пытаюсь визуализировать, какую функцию я здесь выполняю. Он просто перебирает исходный и обновленный [arr], отслеживая количество циклов? - person DNguyen; 26.10.2018