冒泡排序有效,但只切换前两个数字,并且仅切换某些数字

时间:2018-10-05 05:04:06

标签: python sorting bubble-sort

这可能是我见过的最奇怪的问题,当我将索引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开始。

1 个答案:

答案 0 :(得分:0)

只要列表中有重复项,就会发生这种情况。 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