Проблема с реализацией части сортировки выбором

Я реализовал сортировку выбором в python, но не мог понять эту крошечную часть внутреннего цикла for.

Цикл for для j, у меня есть диапазон от внешнего индекса i до максимальной длины-1, это имеет для меня большой смысл, но результат не будет учитывать последнее число в массиве, и я не могу думать о причина.

Однако, если я изменю диапазон с i на максимальную длину, это сработает. (что, насколько мне известно, должно превышать массив, поскольку alist[len(alist)] будет считать 1 цифру, превышающую максимальное число).

#Go over the loop, find the smallest num
def swap(arr, num_1, num_2):
    temp = arr[num_1]
    arr[num_1] = arr[num_2]
    arr[num_2] = temp

def selectionSort(alist):
    for i in range(0, len(alist)-1):
        min = i
        # for j in range(i+1, len(alist)):
        # Why len(alist)-1 doesn't work?
        for j in range(i, len(alist)-1):
            if alist[j] < alist[min]:
                min = j
        if min != i :
            swap(alist,i,min)
    return alist


# Test
print "-------------Test--- ----------"
A = [2,1,9,3,4,100,99,30]
print selectionSort(A)

person Yu Zhou    schedule 03.02.2017    source источник


Ответы (1)


Прочтите еще раз о диапазонах в Python; у вас нет четкого представления о них. range(0, 3), например, примерно эквивалентно [0, 1, 2]. Он останавливается сразу после второго значения. То же самое относится и к ломтикам.

person Tom Zych    schedule 03.02.2017
comment
Я прочитал это, и теперь это имеет смысл! Однако, если это так, скажем, я хочу пройти через этот массив A в тестовом примере, чтобы пройти через них все во внешнем цикле, могу ли я просто иметь for i in range(0, len(alist)) ? так как len(alist) равно 8, и он будет зацикливаться только на A[7] - person Yu Zhou; 04.02.2017
comment
Что ж, это сработает из-за того, как устроена ваша программа. Но если бы я писал сортировку выбором, я бы остановил внешний цикл на предпоследнем элементе и начал бы j с i+1. Также обратите внимание, что по умолчанию начинается с нуля, поэтому вы можете просто сказать for i in range(len(alist)). - person Tom Zych; 04.02.2017
comment
Не могли бы вы уточнить свою мысль? Я смотрел на чью-то реализацию сортировки выбором, она реализована именно так, как вы ее описали. Если, скажем, вы остановите внешний цикл @ предпоследний элемент, не проигнорируете ли вы последний элемент в массиве? Кроме того, чтобы начать j с i + 1, означает ли это, что вы хотите исключить случай, когда j 'й элемент сравнивает сам с собой? - person Yu Zhou; 04.02.2017
comment
Нет смысла сравнивать число с самим собой; это всегда равно. Что касается последнего элемента, мы продолжаем менять местами элементы с более низким значением вверх, поэтому последний элемент всегда будет элементом с наивысшим значением; если бы это было не так, в какой-то момент он был бы заменен вверх. - person Tom Zych; 04.02.2017
comment
Теперь это имеет смысл!! Спасибо - person Yu Zhou; 04.02.2017