冒泡排序有效,但切换回前 2 个数字,并且仅适用于某些数字

Bubble Sort working, but switching back the first 2 numbers, and only with certain numbers

这可能是我见过最奇怪的问题了,当我把索引为3的对象(第4个对象)设置为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:我知道这绝对不是进行冒泡排序的最佳方法,我只是从 python 开始。

只要您的列表中有重复项,就会发生这种情况。 list.remove 移除被移除对象的第一个实例。因此,当您尝试删除索引 3 处的第二个 5 时,您实际上是在删除索引 1 处的 5

解决方案?在这种情况下不要使用 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