Python冒泡排序-假标志

qojgxg4l  于 2023-01-18  发布在  Python
关注(0)|答案(2)|浏览(131)

我在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]

谢谢你的支持。

dhxwm5r4

dhxwm5r41#

你的代码运行得非常好,在你的情况下,while循环取代了冒泡排序中使用的标准double for循环,要重写冒泡排序的代码,应该是这样的:

my_list = [8, 10, 6, 2, 4]  # list to sort

for _ in range(len(my_list)-1):
    for i in range(len(my_list) - 1):
        if my_list[i] > my_list[i + 1]:
            my_list[i], my_list[i + 1] = my_list[i + 1], my_list[i]
print(my_list)

那么,这里是怎么回事呢?在冒泡排序中,你迭代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)

eni9jsuy

eni9jsuy2#

虽然代码不是特别有效,但它确实可以工作。
while循环之前的第一个swapped = True赋值显然初始化了变量,以便while循环运行。
第二个赋值swapped = False建立了这样一种情况,其中假设不可能再进行交换,因此要退出循环。
然后执行for循环,测试假设,如果发生交换,排序过程被认为未完成,因此应该继续while循环,因为可能有更多的交换,为了实现这一点,将交换变量设置为True,因为while循环的逻辑条件将测试此变量,因此您可以看到第三个赋值swapped = True
希望这能把事情弄清楚

相关问题