【问题标题】:Implement ascending sort in a python list在 python 列表中实现升序排序
【发布时间】:2011-12-04 20:05:45
【问题描述】:

作为 python 任务的一部分,我试图在不使用 sort() 方法的情况下实现列表排序(升序),我认为我的逻辑是正确的,但我一直收到错误:

sample=[23,44,12,1,6,87]
temp=0
for i in range(0,len(sample)):
    if sample[i] > sample[i+1]:
        sample[i]=temp
        sample[i]=sample[i+1]
        sample[i+1]=temp

这一直给我一个 list: index out of range 错误,我知道这是因为当 i == 3 时代码仍然执行 i+1。

在这方面需要帮助..

我把代码改成:

for i in range(0,len(sample)-1):
    if sample[i] > sample[i+1]:
        temp=sample[i]
        sample[i]=sample[i+1]
        sample[i+1]=temp

消除错误但不对列表进行排序

【问题讨论】:

  • 快速谷歌搜索将产生许多可能的排序算法。我建议你从那里开始。至少,你的教科书中至少应该有一个。
  • for i in range(0,len(sample)): 更改为for i in range(0,len(sample)-1):。现在你只需要修正你的算法。
  • Steven 所说的 + 您与 temp 的交换逻辑也是错误的,temp 永远不会在代码中 = 的左侧
  • 我建议在“让代码正常工作”之前先买一本严肃的教科书并了解你在做什么。
  • 这是你的作业。大概您的教授已经涵盖了排序算法。如果没有,请参阅faculty.cs.niu.edu/~hutchins/csci241/sorting.htm 并尝试将其中之一翻译成 Python。如果您编写的代码有错误,我们将始终愿意提供指点。

标签: python list sorting


【解决方案1】:

我希望你明白为什么会出现索引超出范围错误。

这是问题之一,但现在让我们检查一下您的代码,因为您有一些“概念性”错误,即您没有完全理解您编写的代码的作用。

这是您的代码实际执行的操作,也是您遇到此类错误时应该如何思考的问题:

sample=[23,44,12,1,6,87]
temp=0


for i in range(0,len(sample)-1):
    if sample[i] > sample[i+1]:
        temp=sample[i]
        sample[i]=sample[i+1]
        sample[i+1]=temp

第一行: 您的 i 将获得 0,1,2 到 5 的值(在这种情况下)。

第二行: 它将检查列表中的成员是否彼此相邻

它将检查第一个(从左到右)是否大于第二个,它将检查 23 > 44,这将是错误的,因此它不会执行其余代码。

没有i 将是 1,因此您将检查 44 > 12,这是真的,因此您的代码将执行,并成功交换这两个。

现在是学习在 python 中交换变量而不使用临时变量的巧妙方法的好时机。

sample[i], sample[i+1] = sample[i+1], sample[i]

如果需要,请阅读更多相关信息,谷歌 python 变量交换。

回到原来的问题。

您已成功交换 44 和 12,此列表为 [23,12,44,1,6,87]

但如果你继续这样做,它会:

用 1 交换 44

44 与 6 交换

不要将 44 与 87 交换。

但是列表现在将是 [23,12,1,6,44,87],并且您的代码将停止执​​行自身,因为 i 现在是 5。

你发现问题了吗?

您需要重新运行几次才能真正订购它,因为它不检查列表是否已组织,而是交换彼此相邻的成员。

因此,如果您愿意(针对此特定列表)运行:

for j in range(3):
    for i in range(0,len(sample)-1):
        if sample[i] > sample[i+1]:
            sample[i], sample[i+1] =sample[i+1], sample[i]

列表将被排序。

对有序集合(如列表)进行排序是一个研究较多的“领域”。

我建议您从非常简单的算法开始阅读排序算法,例如冒泡排序,因为那是您的算法的“目标”(例如 onatm 建议)。

有一些“有趣”的方法可以学习这个算法,例如,check this out

如果您有兴趣,也请阅读this

This site 很好地说明了算法如何工作到排序列表。

祝你好运,如果您有任何疑问,请发表评论。

【讨论】:

    【解决方案2】:

    检查这个:http://faculty.cs.niu.edu/~hutchins/csci241/sorting.htm

    python 冒泡排序:

    sample=[23,44,12,1,6,87]
    
    sorted = False
    while not sorted:
        sorted = True
        for i in range(len(sample) - 1):
            if sample[i] > sample[i+1]:
                sorted = False
                sample[i], sample[i+1] = sample[i+1], sample[i]
    
    print sample
    

    从这里更改:Bubble Sort Homework

    【讨论】:

      【解决方案3】:

      len(t) 引用了您发布的代码之外的内容。你想要的

      for i in range(0,len(sample)-1):
      

      此外,上面的语句将为您增加i,不需要i += 1 语句。 Python 也会为您处理i 的初始化,因此i = 0 语句同样是不必要的。修复这些问题后,您会发现您的排序仍然不正确,但您可能会找到更好的方法来找出原因。

      【讨论】:

        【解决方案4】:

        我对 Python 不太熟悉,但我相信你会这样做:

        for i in range(0,len(sample)):
            if sample[i] > sample[i+1]:
        

        我会尝试将其更改为:

        for i in range(0,len(sample) - 1):
            if sample[i] > sample[i+1]:
        

        希望这会有所帮助。

        【讨论】:

        • 这不是唯一的问题,它会解决即时错误但不会解决算法,因为它不会订购,请查看我的答案以获取更详细的信息:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 2018-06-09
        相关资源
        最近更新 更多