繁体   English   中英

冒泡排序算法中的循环究竟是如何工作的? (Python 3)

[英]How exactly does the loop within a bubble sort algorithm work? (Python 3)

示例代码:

def bubble_sort(my_list):
    n = len(my_list)

    for i in range(n):
        for j in range(0, n - 1 - i):
            if my_list[j] > my_list[j + 1]:
                my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j]


my_list = [94, 17, 5, 28, 7, 63, 44]
bubble_sort(my_list)
print(my_list)

在上面的代码中,我对嵌套循环的 for for __ in range() 部分感到困惑。 这是做什么的,它是如何做到的? 另外, my_list[j], my_list[j+1] = my_list[j+1], my_list[j] 如何重新排列列表值? 抱歉,如果这听起来很愚蠢,但我想了解我正在编写的语法背后的逻辑,而且我找不到可以很好地解释逻辑的地方,所以希望看到这个的人可以。 谢谢你的帮助!

好问题。 我将尝试解决我在您的帖子中发现的两个问题。

问题 1:对于 __ in range() 有什么作用? 范围 function 只生成一个数字列表。 例如,假设 n = 5,则 range(5) 等于 range(n),这反过来生成 [0, 1, 2, 3, 4]。 该列表的长度为 5,其中 0 表示包含,5 表示排除。 由于列表在 python 中是可迭代的,因此 for 循环迭代列表。

例如:

for i in range(5): print(i, end=' ')

将打印 0 1 2 3 4

说了这么多,嵌套循环有什么作用呢? 嗯,首先要注意的是,在这种情况下,范围从零 (0) 开始,这就是为什么你有range(0, ... 。真正令人困惑的是范围 function 内的第二部分。为了要理解为什么会这样,我们需要了解冒泡排序的行为方式。

以输入列表为例:

my_list = [94, 17, 5, 28, 7, 63, 44]

冒泡排序会这样排序:

[17, 5, 28, 7, 63, 44, 94]
[5, 17, 7, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]
[5, 7, 17, 28, 44, 63, 94]

现在,请注意冒泡排序组织列表的方式非常有趣。 所做的是取最大数并将其放在列表的末尾(94),然后取第二大数并将其按顺序放在 94 旁边(63),依此类推。 实际上,我们的列表包含两个边,有序边和无序边。 由于我们已经订购了商品,因此没有理由重复这些商品。 这就是为什么在表达式n - 1 - i有 -i 的原因。

现在,您可能会问为什么要减去-1 原因是属于第二个问题的交换。

问题 2:这(my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j])如何重新排列我的项目?

上面的代码等效于用其他语言执行此操作:

int temp = item[i];
item[i] = item[i + 1];
item[i + 1] = temp;

为了更好地理解这一点,我们需要了解变量在编程中是如何工作的。 顾名思义,变量就是他们所说的,变量,意味着它们的值可能会改变。 如果你给一个变量赋值,然后你给同一个变量赋值另一个值,之前的值将被清除。

由于我们需要将 item[i] 的值放在 item[i + 1] 中,这样做是不正确的

item[i] = item[i + 1]

因为那我们怎么分配

item[i + 1] = item[i]

因为我们删除了 item[i] 中的前一个值。 在这种情况下,采取的方法是使用一个时间变量来保存“容器”之一的值,以便我们成功地进行交换。 唯一的事情是 python 通过使用语法糖并让程序员只需键入以下内容就可以进行值交换,从而完美地做到了这一点:

(my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j]) 

总之,对于第二个问题,我们添加-1是因为我们想要交换最后一个和倒数第二个而不获取IndexError

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM