SelectionSort в алгоритме Гроккинга - PullRequest
0 голосов
/ 26 октября 2018

Я борюсь с частью для цикла в диапазоне () в книге Алгоритм Гроккинга 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]))
  • Итак, во втором selectionsort () for_loop, каждый раз, когда мы заканчиваем итерацию, len (arr) - 1
  • в то время как я увеличиваю каждую итерацию, диапазон (len (arr)) уменьшается.
  • когда я пытаюсь проверить каждую (i, len (arr)) каждой итерации, я получаю: (0,5), (1, 4), (2, 3), (3, 2), (4, 1)
  • Как я мог = 4 в диапазоне (1) возможно?

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

1 Ответ

0 голосов
/ 26 октября 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...