Программа ничего не делает

Сразу оговорюсь, что являюсь новичком в программировании. Возникла проблема при решении задачи из книги саммерфилда по питону (aveage2), где частью задания является сортировка списка от меньшего к большему. Посмотрел некоторые алгоритмы, решил использовать сравнение попарно. Написал код, а он ничего не делает со списком, будто бесконечно где-то застрял, и выполняет N-ное действие бесконечное кол-во раз(было видно по загрузке ЦП). Подскажите пожалуйста что и где стоит исправить, буду нереально благодарен. Если что, список представлен просто ради того, чтобы он был, в основной программе пользователь сам забивает числа в список.

Примечание: задачу надо решить без использования list.sort()

List = [12, 56, 3, 38, 2, 16]

x = 0

while x < len(List):
try:
    if List[x] <= List[x + 1]:
        x += 1
    else:
        if x - 1 < 0:
            a = 0
            List.insert(a, List[x + 1])
            List.remove(List[x + 2])
            x = 0
        else:
            List.insert(x - 1, List[x + 1])
            List.remove(List[x + 2])
            x = 0
except x + 1 == len(List):
    print(List)
    break

Ответы (2 шт):

Автор решения: Zhihar

вы пузырьком что ли сортируете?

тогда как-то странно у вас алгоритм выглядит (методы insert, remove не очень хорошо в цикле использовать), он скорее вот так должен выглядеть:

List = [12, 56, 3, 38, 2, 16]

for j in range(len(List) - 1):
    flag = False
    index_min = j

    for i in range(j, len(List) - 1 - j):
        if List[i] > List[i + 1]:
            flag = True
            List[i], List[i + 1] = List[i + 1], List[i]

        if List[i] < List[index_min]:
            index_min = i

    if not flag:
        break

    if index_min != j:
        List[j], List[index_min] = List[index_min], List[j]

print(List)

ну или если душа требует что-то покороче, то

for j in range(len(List) - 1):
    flag, index_min = False, j

    for i in range(j, len(List) - 1 - j):
        List[i], List[i + 1], flag = (List[i + 1], List[i], True) if List[i] > List[i + 1] else (List[i], List[i + 1], flag)
        index_min = i if List[i] < List[index_min] else index_min

    if not flag:
        break

    List[j], List[index_min] = (List[index_min], List[j]) if index_min != j else (List[j], List[index_min])
→ Ссылка
Автор решения: S.H.

Я думаю, что ошибка происходит по следующей причине:

вы используете методы insert и remove в списке, одновременно итерируясь ("проходя") по нему.

Это приводит вот к какому результату: (я специально пишу объяснение очень простыми словами)

Вы нашли пару элементов. По сути, Вам нужно поменять их местами.

Но в тот момент, когда Вы сделалии remove элемента из списка - список изменился. Он стал другой длинны, и тот элемент, с которым Вы меняете "неподходящий" элемент местами, встал на его место.

Исправить это просто: достаточно вместо insert и remove менять местами элементы, просто исопльзуя присваивание.

Что, в общем то, и показано в другом ответе на Ваш вопрос. ( List[i], List[i + 1] = List[i + 1], List[i] - это и есть операция "поименять местами два элемента" )

→ Ссылка