【问题标题】:Insertion Sort: Incorrect output插入排序:输出不正确
【发布时间】:2017-02-15 02:51:15
【问题描述】:

我正在尝试通过编写一个小脚本来了解有关插入排序算法的更多信息,但是我卡住了。

一切都很好,除了一个数字被多次显示。

我的代码:

#
# Insertion Sort
#

def _ord(l):
 lst=[]
 for k in l:
  if not lst:
   lst.append(k)
   continue

  for a,b in enumerate(reversed(lst)):
   if k <= lst[a]:
    lst.insert(a,k)

   if a == len(lst)-1:
    lst.append(k)

 return lst

if __name__ == '__main__':
 l = [3,2,4,6,5,1]
 print _ord(l)

输出:

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

【问题讨论】:

  • 旁注:虽然将其作为学习练习完全可以,但我应该注意,对于生产代码,您可能希望使用list.sort/sorted(对一大堆进行排序元素)或the bisect module(将单个元素插入已排序的list)。对于一般用途的排序,基本上你用 Python 编写的任何东西都无法击败内置插件(在参考解释器上是 C 加速的)。

标签: python insertion-sort


【解决方案1】:
def _ord(l):
    lst=[]
    for k in l:
        print k
        if not lst:
            lst.append(k)
            continue

        for a,b in enumerate(reversed(lst)):
            print a, b
            if k <= lst[a]:
                lst.insert(a,k)
                break  # <-- add this

            if a == len(lst)-1:
                lst.append(k)
        print lst
        print '-' * 80

    return lst


l = [3,2,4,6,5,1]
print _ord(l)

您可以使用printpdb 来调试您的代码。

【讨论】:

    【解决方案2】:

    这里的问题是k=1k &lt;= lst[a]True 对于列表中的每个其他整数,所以它插入了五次。

    片段的快速修复是引入break点:

    def _ord(l):
     lst=[]
     for k in l:
      if not lst:
       lst.append(k)
       continue
    
      for a,b in enumerate(reversed(lst)):
       if k <= lst[a]:
        lst.insert(a,k)
        break
       if a == len(lst)-1:
        lst.append(k)
    
     return lst
    
    if __name__ == '__main__':
     l = [3,2,4,6,5,1]
     print _ord(l)
    

    编辑:查看this link 以检查您的片段的执行情况。

    【讨论】:

      【解决方案3】:
      def _old(l):
          for i in range(1, len(l)):
              tmp = l[i]
              for j in reversed(range(i)):
                  if l[j] > tmp:
                      l[j+1] = l[j]
                      l[j] = tmp
                  else:
                      break
          return l
      
      if __name__ == '__main__':
          l = [3,2,4,6,5,1]
          print(_old(l))
      

      【讨论】:

        猜你喜欢
        • 2018-12-06
        • 2015-06-12
        • 2021-01-09
        • 1970-01-01
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多