#python #python-3.x #loops #bubble-sort
#python #python-3.x #циклы #пузырьковая сортировка
Вопрос:
Итак, я немного программировал на python (в школе), но недавно я возвращаюсь к этому. У меня есть два разных цикла for, один, который я сделал сам (который не работает и хэшируется), и один, который работает (в строке над ним).
Мне было интересно, почему хэшированный код не работает в функции сортировки пузырьков, он по-прежнему повторяется одинаковое количество раз, но по какой-то причине при подсчете цикла число 99 будет медленно перемещаться до конца. Однако при обратном отсчете он завершает это за 1 шаг. Вот код
import random
unsorted_list = [2, 99, 95, 59, 54, 84, 6, 77, 45, 26]
print("The unsorted list is given as = ",unsorted_list)
def Bubble_sort(random_list):
Len_list = len(random_list)
for pass_number in range(Len_list-1,0,-1):
#for pass_number in range(0,Len_list,1):
print(pass_number)
print(random_list)
for A in range(pass_number):
if random_list[A] > random_list[A 1]:
temp = random_list[A]
random_list[A] = random_list[A 1]
random_list[A 1] = temp
Bubble_sort(unsorted_list)
Скриншоты моих результатов, выполняющих два разных цикла по отдельности, можно увидеть ниже по ссылкам 1 и 2. Ссылка 1 ведет обратный отсчет (правильный путь), а ссылка 2 показывает подсчет (неправильные результаты), но я не знаю, почему они неверны.
Мой вопрос в том, почему это не работает в обоих направлениях??
Спасибо за помощь!
Дополнительная информация = Это было в python 3.9.0
Ответ №1:
Только один из ваших внешних циклов правильно перекрывается с вашим внутренним циклом.
У этого внутреннего цикла есть одна четкая функция: он перемещает наибольшее значение до позиции pass_number
, по одному обмену за раз. Любой другой прогресс является побочным продуктом; критическим результатом является этот самый большой элемент.
Когда вы начинаете с pass_number
конца списка (на самом деле, один короткий: A 1
это конец), программа работает просто отлично: первый проход перемещается 99
в конец; следующий перемещает 95 рядом с ним и так далее.
Важно отметить противоположное движение: небольшое значение может перемещаться влево только на одну позицию за каждый проход.
Когда вы отменяете только один цикл, теперь у вас есть комбинация, которая исправит часть работы, но почти гарантированно завершится неудачей. Вы не касаетесь последнего элемента в списке до последней итерации; если этот последний элемент не окажется одним из двух самых больших, он не сможет занять свое правильное положение. С ним обращаются только на последней итерации.
Если вы хотите отменить процесс, хорошо — сделайте это. Когда вы отменяете подсчет для pass_number , вы также должны отменить ограничение на внутренний цикл, чтобы первая итерация рассматривала весь список по порядку.
Можете ли вы взять это оттуда? Выяснение этого изменения внутреннего цикла — хорошее вводное упражнение.
Комментарии:
1. Да, я должен быть в состоянии сделать это отсюда, это очень полезно, спасибо.
2. Не забудьте выбрать «лучший ответ», чтобы SO мог заархивировать вопрос — и я думаю, вы получите за это несколько баллов.