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