#python #python-3.x #algorithm #sorting
#питон #python-3.x #алгоритм #сортировка
Вопрос:
Новичок в программировании и алгоритмах. Пробуем самый простой — жевательный сорт. Но, похоже, последнее число не сортируется? Не могу толком понять, почему.
Исходный список выглядит следующим образом — list = [4, 5, 3, 10, 17, 6, 2, 22, 76, 99, 18, 7]
но мой вывод выглядит следующим образом — [99, 2, 3, 4, 5, 6, 7, 10, 17, 18, 22, 76]
По какой-то причине 99 не заменяется на задний план, и я не могу точно определить, почему.
list = [4, 5, 3, 10, 17, 6, 2, 22, 76, 99, 18, 7]
def bblSort(list):
for i in range(len(list)):
print(list[i])
for j in range(len(list) - 1):
if list[i] <list[j 1]:
list[i], list[j 1] = list[j 1], list[i]
print(list)
Комментарии:
1. Это не пузырьковая сортировка — пузырьковая сортировка сравнивает только соседние элементы.
2. изменить
range(len(list) - 1)
— >range(len(list)-i - 1)
,if list[i] <list[j 1]:
наif list[i] >list[j 1]:
иlist[i], list[j 1] = list[j 1], list[i]
наlist[j], list[j 1] = list[j 1], list[j]
Ответ №1:
Пузырьковая сортировка может быть реализована с помощью двух циклов for или цикла while и цикла for. Вот реализация, которая использует while и цикл for и ее легче понять.
Эта функция просматривает список с помощью внутреннего цикла for, сравнивает каждый объект с объектом после него и при необходимости меняет их местами. Внешний цикл while гарантирует, что он повторяет цикл for снова и снова по всему списку, пока дальнейшая замена не потребуется.
def bubble_sort(unsorted_list):
my_list = list(unsorted_list) # create a copy to avoid mutating the original list
unsorted = True
while unsorted:
unsorted = False
for i in range (len(my_list)-1):
if my_list[i] > my_list[i 1]:
unsorted = True
my_list[i] , my_list[i 1] = my_list[i 1], my_list[i]
return my_list
unsorted_list = [5,2,4,90,140,23,554,32,98,12,15,0,43,-34,10]
print(bubble_sort(unsorted_list))
С принтами:
[-34, 0, 2, 4, 5, 10, 12, 15, 23, 32, 43, 90, 98, 140, 554]
Ответ №2:
Вам нужен только один цикл, так как пузырьковая сортировка сравнивает соседние значения. Попробуйте выполнить один цикл с i, а затем просто сравнить list[i] и list[i 1] (следите за концом списка)
Кстати, рекомендуется не вызывать ваши переменные с именами типов, здесь выберите другое имя для переменной ‘list’.
Комментарии:
1. тай, мой друг, я попробую
2. Что делать, если элемент нужно переместить назад на несколько позиций в списке? Один цикл поменял бы этот элемент местами только на одно место.
3. Более уместно в качестве комментария, а не ответа
Ответ №3:
Для сортировки пузырьков вам нужно выполнить несколько проходов по списку, чтобы убедиться, что он отсортирован. Каждый проход гарантированно перемещает наибольшее число в конец сортируемой части списка. Это означает, что вам не нужно снова сортировать эту позицию, поэтому вам нужно только отсортировать до этой позиции на следующем проходе.
Я не очень разбираюсь в Python, так что это псевдокод. Он выполняет сортировку списка на месте в порядке возрастания.
bubblesort(list myList)
for (hi <- myList.length - 1 downto 0) do
for (lo <- 1 to hi) do
if (myList[lo - 1] > myList[lo]) then
swap(myList[lo - 1], myList[lo])
endif
endfor
endfor
end bubblesort()
Каждый проход сортирует часть списка между началом и hi
с hi
уменьшением на единицу для каждого прохода.
Для получения дополнительного кредита подумайте о том, как закончить игру раньше, если пас не приводит к каким-либо свопам. В этом случае список уже отсортирован по порядку.
Ответ №4:
В вашем коде есть несколько проблем, если вашей целью было реализовать пузырьковую сортировку:
- Сортировка пузырьков сравнивает и меняет местами только соседние элементы, поэтому сравнение между
lst[j]
иlst[j 1]
. - Затем сравнение должно быть соответствующим образом адаптировано к
lst[j] > lst[j 1]
, что указывает на то, что эти два значения отображаются в неправильном порядке. - Хотя это и не обязательно для его работы, хороший алгоритм пузырьковой сортировки не будет проверять пары, которые наверняка уже находятся в правильном порядке. Это означает, что внутреннему циклу действительно требуется на одну итерацию меньше при каждом
i
увеличении времени, поскольку в конце списка будет (растущая) часть, которая уже отсортирована.
Итак:
def bblSort(lst):
for i in range(len(lst)):
for j in range(len(lst) - 1 - i):
if lst[j] > lst[j 1]:
lst[j], lst[j 1] = lst[j 1], lst[j]