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

#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 мог заархивировать вопрос — и я думаю, вы получите за это несколько баллов.