【问题标题】:Sorting algorithm in PythonPython中的排序算法
【发布时间】:2019-09-18 22:29:18
【问题描述】:

目前我在学习视频时发现了此代码。然而,代码有一个被指出的缺陷,但我无法理解部分算法以及为什么该缺陷是一个“缺陷”。

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”。 cmets的人指出,原因是应该是“while i > 0”或“while i >= 1”,而不是“while i > 1”。

while i > 1:

但是我无法理解为什么会这样。

【问题讨论】:

  • 1 从 i 中减去,因为索引从 0 开始,所以最后一个索引的长度为 - 1。
  • while i &gt; 0 是正确的,因为那时j == 0,当numList[j] &gt; numList[j+1] 时你交换i=1j=0 索引,因此2 和1 将被翻转,你得到1,2 ,3,4,6

标签: python python-3.x bubble-sort


【解决方案1】:

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

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

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

两个也是最让我头疼的一个

while i &gt; 0 是正确的,因为在第一次迭代中,i == 1j == 0,当 numList[j] &gt; numList[j+1] 时交换 j+1 == 1j == 0 索引,因此 2(索引 1)和 1(索引 0 ) 会被翻转,你会从2,1,3,4,6 得到1,2,3,4,6

【讨论】:

    【解决方案2】:

    该算法通过切换邻居直到最大“冒泡”,将前 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。您的算法称为冒泡排序。

    【讨论】:

      最近更新 更多