【问题标题】:Do you know why my bubblesort isn't working? [Python] [duplicate]你知道为什么我的冒泡排序不起作用吗? [Python] [重复]
【发布时间】:2018-06-28 11:08:22
【问题描述】:

我正在尝试从头开始在 python 中制作一个冒泡排序,你知道它为什么不起作用吗?我的错误列表索引超出范围。

data = [1, 32, 50, 12, 14, 7, 45, 27, 18, 9, 19, 22, 51, 42, 4, 25, 13, 6, 21, 49, 41, 37]

def bubbleSort(alist):
    length = len(alist)
    for i in range(length):
        first = alist[i]
        second = alist[i + 1]
        if first > second:
            a, b = alist.index(first), alist.index(second)
            alist[b], alist[a] = alist[a], alist[b]


    return data

print(bubbleSort(data))

谢谢, 斯科特

【问题讨论】:

  • 无需在该行中调用alist.index(...。索引是ii+1,因为您之前使用过它们。 index 也可能因重复而失败
  • 更正index out of range 错误不会使它成为一个有效的冒泡排序程序。您可能想更改标题。

标签: python bubble-sort


【解决方案1】:

将循环更改为:

for i in range(length-1):

因为你抓住 alist[i + 1] max i 应该比列表长度小 2

【讨论】:

    【解决方案2】:

    检查您是否处理了最后一个元素的情况。

        first = alist[i]
        second = alist[i + 1]
    

    第二行使用 i+1。因此,当 i 指向列表的最后一个索引时,第二个元素 alist[i+1] 似乎超出了列表索引。

    【讨论】:

      【解决方案3】:

      找到解决办法:

      data = [1, 32, 50, 12, 14, 7, 45, 27, 18, 9, 19, 22, 51, 42, 4, 25, 13, 6, 21, 49, 41, 37]
      
      def bubbleSort(alist):
          length = len(alist) - 1
          while sorted(alist) != alist:
              for i in range(length):
                  first = alist[i]
                  second = alist[i + 1]
                  if first > second:
                      a, b = alist.index(first), alist.index(second)
                      alist[b], alist[a] = alist[a], alist[b]
      
      
          return data
      
      print(bubbleSort(data))
      

      【讨论】:

      • 1) 您将所需的输出放入while 循环的条件中? 2)你每次对alist进行排序,在执行这个循环的时候?
      • 这完全没有意义。您正在调用外部排序函数来确定何时终止循环。为什么??你不认为这是“作弊”吗?而index 的使用正在将 O(n**2) 算法更改为 O(n**3) 算法。你还没有实现冒泡排序。甚至没有关闭。
      • 实际上,鉴于对sorted 的调用本身就是 O(n*log(n)),我会说你已经实现了 O(n**2*log(n) ) 排序,它使用内置排序函数作为算法的一个组成部分。为什么不直接返回sorted的结果呢?
      猜你喜欢
      • 2015-06-29
      • 2012-06-26
      • 2019-11-23
      • 2017-04-04
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      相关资源
      最近更新 更多