目前,我是在从视频中学习时找到此代码的。 但是,代码中指出了一个缺陷,但是我无法理解算法的一部分,以及为什么该缺陷是“缺陷”。

i = len(numList) - 1

while i > 1:
    j = 0

    while j < i:

        # If the value on the left is bigger switch values
        if numList[j] > numList[j+1]:
            temp = numList[j]
            numList[j] = numList[j + 1]
            numList[j + 1] = temp
        else:
            print()

        j += 1

    i -= 1

for k in numList:
    print(k, end=", ")
print()

该代码应该从数字列表中对数字进行排序,但是我无法理解其中的两件事:

一个是“为什么从“ i”中减去1?”

i = len(numList) - 1

第二,当算法的最后一个数字为“ 1”时,该算法将无法正确排序数字。 例如,列表“ 4、2、6、3、1”将被排序为“ 2、1、3、4、6”,而不是正确的“ 1、2、3、4、6”。 评论人士指出,这样做的原因是应该是“ while i> 0”或“ while i> = 1”,而不是“ while i> 1”。

while i > 1:

但是我不明白为什么会这样。

#1楼 票数:1

“为什么从“ i”中减去1?”

因为集合是零索引的。 您有N个元素,但最后一个可索引的值始终为N-1

j < i且您访问numList[j+1] ,则当j处于其最大值j == i-1i处于其最大值len(numList) - 1 ,则访问numList[(i-1)+1] == numList[i] == numList[len(numList) - 1] ,这是最后一个可用的元素。

两个和一个使我的头部受伤最多的

while i > 0是正确的,因为在第一次迭代中, i == 1j == 0 ,并且当numList[j] > numList[j+1] ,交换了j+1 == 1j == 0索引,因此,将翻转2(索引1)和1(索引0),然后从2,1,3,4,6得到1,2,3,4,6

#2楼 票数:1

该算法通过切换邻居直到最大“冒泡”,将前i + 1个数字中的最大值传递到前面(第i + 1位置)。 在第一次迭代中,i = len(numList)-1,因此整个numList的最大值(索引从0开始,在len(numList)-1结束)被带到前面。 这是最大值,应该是最后一个。 现在您只需要担心第一个i-1值,因此i减少了一个。 因为i> 1忘记了将第一个元素放到前面(在第二个位置),所以示例中的2和1的顺序不正确,因为它们需要切换。 因此,您需要i = 1迭代步骤。

有一个很棒的网站,可帮助您直观地查看排序算法。 https://visualgo.net/en/sorting?slide=1 您的算法称为冒泡排序。

  ask by Aulmeies translate from so

未解决问题?本站智能推荐:

1回复

理解Python中的冒泡排序

我真的很困惑这个代码是如何工作的。 假设列表的输入是[C,B,A,exit]。 在第一个“for”语句中,它将在列表位置0和1之间交换,即C和B. 这将导致出现[B,C,A]的新列表 但是,为什么在第二组“for”语句中,它会在A和B之间交换而不是C和A? 这可以在照片
7回复

Python 3 中的冒泡排序

用 Python 3 编写冒泡排序程序。 冒泡排序是一种将值列表按顺序排序的算法。 我试图在最后得到这个结果。 我怎样才能完成它? 我得到的输出: 我想要的结果:
1回复

使用文件夹内的冒泡排序(或其他算法)根据大小对图像文件进行排序

我需要一些帮助来根据文件大小对文件夹内的所有文件(图像)进行排序。 尝试使用冒泡排序算法但无法使其工作。 my_dict是一本字典,但是当我使用此代码时出现此错误: 我需要什么:将执行时间与冒泡排序和另一种排序算法进行比较。 在对不同数量的项目进行排序时(前 100 个文件,然后是 300
2回复

气泡排序-变化(性能时间)-Python

我在python中有3种气泡排序方法的变体,代码链接-github 我正在使用此功能为他们测试性能 从输出: 我认为,在bubbleSort1()中,我不是通过检查是否交换来停止循环,这是在bubbleSort2()中完成的,这可能是时间差异的原因。 不确定bubbleSo
3回复

Python 3无限循环与冒泡排序

我有一个问题,我必须排序一个数字列表,我做得很好。 但后来我要列出列表中5个最高数字的列表,我必须注意到有重复的数字。 但是,当我尝试这样做时,没有任何打印。 如果我尝试打印“计数”,则只会打印无限数量的增加数字。 我究竟做错了什么? #这是我的问题所在
2回复

Python 3:优化的冒泡排序

请帮忙。 我需要优化我的冒泡排序算法,以便比非优化的bubbleSort获得更少的总比较。 我设法创建了'正常冒泡排序(仅从左到右): 所以基本上我不知道如何创建一个'优化的bubbleSort',一个bubbleSortPlus函数,其中气泡在两个方向上传播:从左到右,紧接着是从右
1回复

Python冒泡排序循环问题

所以,我曾经在 python 中编程过一点(在学校里),但我最近又回到了它。 我有两种不同的 for 循环,一种是我自己做的(不起作用并且被散列了),另一种有效(在它上面的那一行)。 我想知道为什么散列出来的代码在冒泡排序函数中不起作用,它仍然循环相同的次数,但是由于某种原因,在循环计数时,99
1回复

如何使用python对二维数组进行冒泡排序

我有这个列表,它总结了 2018 年的一些 NHL 球员统计数据。我想按 pts 对它们进行排序,这是使用气泡的第 7 个值。 我知道 python 上的内置排序功能,但我更愿意使用冒泡排序甚至快速排序。 任何人都可以帮忙吗? 这是我到目前为止所做的: