Объсните переключение флага в цикле сортировки

Э.Р.А

Новичок
Пользователь
Июл 14, 2024
7
0
1
Прошу знающих людей объяснить мне один момент который я еще недоконца понял. Я знаю что надо поставить флаг чтобы исключить лишние интерации. Знаю что его нужно поставить наверху над циклом(вот здесь я не понимаю, но знаю что так положенно) , перед вычислением и в конце. И если цикл вычисллений не работал то значение False остается неизмененым и цикл дожен завершится. Впервые решил воспользоватся визуализатором, загрузил, и увидел что за время работы программы флаг несколько раз переключался в False и обратно в TRue и программа продолжала работать, а после окнчания сортировки благополучно завершилась. Теперь я не понимаю
Python:
a = [17, 24, 91, 96, 67, -27, 79, -71, -71, 58, 48, 88, -16, -78, 96, -76, 56, 92, 14, -6, 52]
n = len(a)
sort =True
while sort:
    sort = False
    for j in range(n - 1):
        if a[j] > a[j + 1]:
            a[j], a[j + 1] = a[j + 1], a[j]
            sort = True
print(a)
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
964
219
43
20
Москва
Если вкратце, флаг отвечает на то, надо ли дальше сортировать список. По умолчанию, мы считаем что он не отсортирован, по этому задаём значения флагу True. Это делается до цикла, по скольку сам цикл, использует переменную sort, чтобы понять, надо ли выполнять итерацию, и если её не задать до цикла, просто будет ошибка отсутствия переменной.

Потом начинается тело цикла, и мы говорим - ага, давайте пока предположим, что список отсортирован (задаём значение флага False). И после этого, начинаем проходить по значениям списка и смотреть, а может они не в том порядке (это все в цикле range)? Если они и правда не в том порядке, то мы меняем их местами, и сбрасывает флаг (на True), то есть говорим - не, список был не отсортирован, мы его поменяли. И в таком случае мы запустим новую итерацию цикла while, по скольку флаг опять True.

Но однажды, начнётся итерация цикла while, флаг станет снова False, мы пройдем цикл range, и... Ничего не поменяем, все элементы уже стоят в правильном порядке, список отсортирован, флаг останется False и новая итерация цикла while не начнется
 
  • Мне нравится
Реакции: 4olshoy_blen

Форум IT Специалистов