我试图通过编写一个小脚本来了解插入排序算法的更多信息,但是我遇到了问题。
一切都很好,除了一个数字被多次显示。
我的代码:
#
# 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]
答案 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)
您可以使用print
或pdb
调试代码。
答案 1 :(得分:2)
此处的问题是,k=1
,k <= 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))