【问题标题】:Python3 insertion sort iterating backwards not workingPython插入排序向后迭代不起作用
【发布时间】:2016-07-14 17:59:58
【问题描述】:

我是 Python 的初学者,正在尝试用该语言实现插入排序。但是,当我在列表上尝试我的代码进行排序时,我会得到相同的列表。我发现代码甚至没有进入第二个循环。我正在使用 Python 3。以这种方式向后迭代有什么问题?

def ins_sort(us_in):
  tmp = None
  for key in range(1, len(us_in)-1):
    for i in range(key, 0, -1):
      if us_in[key] < us_in[i] and key != 0:
        tmp = us_in[key]
        us_in[key] = us_in[i]
        us_in[i] = tmp
  return us_in

print(ins_sort([5,2,4,6,1,3]))

结果:

[5,2,4,1,6,3]

【问题讨论】:

  • 修复缩进后,我在第二个循环中放置了一个打印语句,它按预期执行(我已经用固定缩进更新了你的问题)。您的迭代器没有问题。

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


【解决方案1】:

您的代码中现在有 2 个问题。如果您无法弄清楚,请将鼠标悬停在黄色上;)

这段代码中有一个:

for key in range(1, len(us_in)-1):

你想做for key in range(1, len(us_in)):,这样你就可以到达列表的每个元素

另一个在这个区块中:

if us_in[key] < us_in[i] and key != 0:
    tmp = us_in[key]
    us_in[key] = us_in[i]
    us_in[i] = tmp

当您进行迭代时,key 与您正在经历的相同。您希望它与i 一起移动,而不仅仅是保持静止。您可以用i-1 替换每一个i,用i 替换每一个key 来解决这个问题。

【讨论】:

    【解决方案2】:

    提示:将“打印”放在任何地方,这些将帮助您跟踪变量的状态。

    也就是说,尝试将 tmp 变量放在“if”语句之外。 对于向后跑,试试这个:

        for i in range(end):
            backwards = end - i
        #do something using "backwards" instead of "i"
    

    看起来你得到了答案,无论如何我不会删除这个,所以你可以保留小费,因为你是一个初学者,打印将是你最好的朋友。相信我。

    【讨论】:

    • 他倒退的方法很好用。我发现出了什么问题。如果您好奇,请参阅我的答案:)
    • 你是对的,尝试了你的答案并且效果很好,但我仍然很好奇为什么他的代码不能使用稳定的“关键”变量。
    • 如果您考虑一下,如果key 保持不变,它将继续将ikey 交换,因为i 减少,这不是您想要的插入排序。使用插入排序,您可以做两件事中的一件。 a) 在列表中向下交换元素,直到到达末尾;或者 b) 将元素与它最早的位置交换。 OP 看起来像是在做 a),但他有一点挑战
    • 好的,谢谢你的提示。我没有意识到会发生这种情况。
    【解决方案3】:

    您主要需要编辑两行。 第三行应该是 len (us_in) 而不是 len(us_in)-1 在 if 语句中它应该是 我 >= 0 代替 键!=0 第二个循环也应该从键 -1{ 少一次迭代}

    开始

    【讨论】:

    • 这不起作用,请尝试运行它。如果您对 OP 的代码不起作用的原因感到困惑,请参阅我的解决方案 :)
    • 是的,我同意这不起作用。你的解决方案是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多