Программа ничего не делает
Сразу оговорюсь, что являюсь новичком в программировании. Возникла проблема при решении задачи из книги саммерфилда по питону (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 шт):
вы пузырьком что ли сортируете?
тогда как-то странно у вас алгоритм выглядит (методы 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])
Я думаю, что ошибка происходит по следующей причине:
вы используете методы insert и remove в списке, одновременно итерируясь ("проходя") по нему.
Это приводит вот к какому результату: (я специально пишу объяснение очень простыми словами)
Вы нашли пару элементов. По сути, Вам нужно поменять их местами.
Но в тот момент, когда Вы сделалии remove элемента из списка - список изменился. Он стал другой длинны, и тот элемент, с которым Вы меняете "неподходящий" элемент местами, встал на его место.
Исправить это просто: достаточно вместо insert и remove менять местами элементы, просто исопльзуя присваивание.
Что, в общем то, и показано в другом ответе на Ваш вопрос. ( List[i], List[i + 1] = List[i + 1], List[i] - это и есть операция "поименять местами два элемента" )