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

问题描述 投票:1回答:1

示例代码:

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)

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

python python-3.x sorting nested-loops bubble-sort
1个回答
1
投票

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

问题1:范围()中的__是什么?范围函数只生成一个数字列表。例如,假设n = 5,则范围(5)等于范围(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)开始,这就是为什么你有范围(0,......。真正令人困惑的是范围函数中的第二部分。要理解为什么会这样,我们需要了解冒泡排序的行为。

以输入列表为例:

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。

现在,为什么要减去-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]

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.