我在Python 3中的冒泡排序脚本中遇到了这种情况:
my_list = [8, 10, 6, 2, 4] # list to sort
swapped = True
while swapped:
swapped = False
for i in range(len(my_list) - 1):
if my_list[i] > my_list[i + 1]:
swapped = True # a swap occurred!
my_list[i], my_list[i + 1] = my_list[i + 1], my_list[i]
print(my_list)
我不明白while循环中的 * swapped = False *,难道不应该中断while循环而不是标记列表的元素吗?
我试着加上一个 * else * 子句:
my_list = [8, 10, 6, 2, 4] # list to sort
swapped = True # It's a little fake, we need it to enter the while loop.
while swapped:
swapped = False # no swaps so far
for i in range(len(my_list) - 1):
if my_list[i] > my_list[i + 1]:
swapped = True # a swap occurred!
my_list[i], my_list[i + 1] = my_list[i + 1], my_list[i]
else:
print("No swap")
print(my_list)
But the output shows me:
No swap
No swap
No swap
No swap
No swap
No swap
No swap
No swap
[2, 4, 6, 8, 10]
谢谢你的支持。
2条答案
按热度按时间dhxwm5r41#
你的代码运行得非常好,在你的情况下,while循环取代了冒泡排序中使用的标准double for循环,要重写冒泡排序的代码,应该是这样的:
那么,这里是怎么回事呢?在冒泡排序中,你迭代
n
个元素的列表,n-1
次。对于每一对相邻的元素对,如果它们没有排序,你通过交换它们来排序它们。在最好的情况下,你需要对列表进行0次迭代来排序它们,因此得到一个排序的列表。在最坏的情况下,你需要n-1
次来排序所有的列表。也就是说,当列表的最小值被放在末尾时,它必须进行所有的n-1
交换才能到达它应该在的位置:第一个。现在,为什么你的代码是这样工作的,为什么它是
more optimal
。看,标准冒泡排序使用的方法,总是基于最坏的情况。即使你的列表比n-1
迭代更早排序,它仍然会检查它是否需要交换。这就是你的代码更有效的地方。一旦没有交换了,你停止迭代过程并返回排序后的列表。2它在排序列表所需的最小迭代次数后跳出while循环。正如tadman已经指出的,这是一个不需要优化的次优排序方法,冒泡排序是一个缓慢的方法,复杂度为
O(n*n)
,现在你将复杂度降低到O(minimal iterations * n)
,但这仍然是O(n*n)
。eni9jsuy2#
虽然代码不是特别有效,但它确实可以工作。
while循环之前的第一个
swapped = True
赋值显然初始化了变量,以便while循环运行。第二个赋值
swapped = False
建立了这样一种情况,其中假设不可能再进行交换,因此要退出循环。然后执行for循环,测试假设,如果发生交换,排序过程被认为未完成,因此应该继续while循环,因为可能有更多的交换,为了实现这一点,将交换变量设置为True,因为while循环的逻辑条件将测试此变量,因此您可以看到第三个赋值
swapped = True
。希望这能把事情弄清楚