插入排序:输出不正确

时间:2017-02-15 02:51:16

标签: python insertion-sort

我试图通过编写一个小脚本来了解插入排序算法的更多信息,但是我遇到了问题。

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

我的代码:

#
# 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]

3 个答案:

答案 0 :(得分:2)

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调试代码。

答案 1 :(得分:2)

此处的问题是,k=1k <= 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以查看片段的执行情况。

答案 2 :(得分:0)

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))