Bubble Sort работает, но переключается обратно на первые 2 числа и только с определенными числами - PullRequest
0 голосов
/ 05 октября 2018

Это может быть самая странная проблема, которую я когда-либо видел, когда я устанавливаю объект с индексом 3 (четвертый объект) равным 5, у алгоритма сортировки пузырьков возникают проблемы, но когда я устанавливаю его на 12, проблемауходит, хотя и 12, и 5 являются более низкими числами, чем оба числа в индексах 2 и 4 (числа до и после 5/12). Вот код и вывод:

array_to_sort = [10, 5, 13, 5, 42]
should_stop = False
print(array_to_sort)
while should_stop == False:
    should_stop = True
    index = 1
    for back_number in array_to_sort:
        print(array_to_sort)
        front_number = array_to_sort[index]
        if back_number > front_number:
            array_to_sort.remove(back_number)
            array_to_sort.remove(front_number)
            array_to_sort.insert(index - 1, front_number)
            array_to_sort.insert(index, back_number)
            should_stop = False
        if index + 1 < len(array_to_sort):
            index += 1

(очевидно, не весь вывод):

[10, 5, 13, 5, 42]

[10, 5, 13, 5, 42]

[5,10, 13, 5, 42]

[5, 10, 13, 5, 42]

[10, 5, 5, 13, 42]

[10, 5, 5, 13, 42]



Однако, в конце концов, он полностью сортируется

Затем с тем же кодом, но если я установлю массив следующим образом:

array_to_sort = [10, 5, 13, 12, 42]

Выходная информация становится ожидаемой:

[10, 5, 13, 12, 42]

[10, 5, 13, 12, 42]

[5, 10, 13, 12, 42]

[5, 10, 13, 12, 42]

[5, 10, 12, 13, 42]

[5, 10, 12, 13, 42]

PS: я знаю, что это определенно не лучший способ сделать пузырьковую сортировку, я только начинаюс питоном.

1 Ответ

0 голосов
/ 05 октября 2018

Это произойдет каждый раз, когда в вашем списке есть дубликаты.list.remove удаляет первый экземпляр удаляемого объекта.Поэтому, когда вы пытаетесь удалить второй 5 с индексом 3, вы фактически удаляете 5 с индексом 1.

Решение?Не используйте list.remove в этом сценарии.Просто поменяйте местами два значения.Это будет проще всего, если вы используете цикл над range.

for back_number in range(len(array_to_sort)-1):
        print(array_to_sort)
        front_number = array_to_sort[back_number+1]
        if array_to_sort[back_number] > array_to_sort[front_number]:
            array_to_sort[front_number],array_to_sort[back_number] = array_to_sort[back_number], array_to_sort[front_number]
            should_stop = False
...