我尝试在Python实现下一个伪代码(从Russian page for insertion sorting):插入排序的伪代码是否正确?
for i = 2, 3, ..., n:
key := A[i]
j := i - 1
while j >= 1 and A[j] > key:
A[j+1] := A[j]
j := j - 1
A[j+1] := key
我有一个错误: 回溯(最近通话最后一个): 文件 “insertion.py”,第6行,在test_sort self.assertEqual(sort([5,2,6,3,7]),[2,3,5,6,7]) 文件“insertion.py”,行12,按照 排序key = a [我] IndexError:列表索引超出范围
我的代码的排序()是:
def sort(a):
len_a = len(a)
len_a_plus_1 = len_a + 1
for i in range(2, len_a_plus_1):
key = a[ i ]
j = i - 1
while j >= 1 and a[ j ] > key:
a[ j + 1 ] = a[ j ]
j -= 1
a[ j + 1 ] = key
return a
如果我改变参数的范围()调用:
for i in range(2, len_a)
...然后我得到不正确的结果:
[5, 2, 3, 6, 7]
是我的代码错误或algorythm在article innacurate?
更新。
我改变了代码(从0索引的Python原理),但它不正常工作:
def sort(a):
len_a = len(a)
for i in range(1, len_a):
key = a[ i ]
j = i - 1
while j and a[ j ] > key:
a[ j + 1 ] = a[ j ]
j -= 1
a[ j + 1 ] = key
return a
输入:[5,2,6,3,7] 输出:[5,1 2,3,6,7]
决议。
我们发现了解决方案:
while j and a[ j ] > key
768,16是
while j >= 0 and a[ j ] > key
请检查Python代码约定:http://www.python.org/dev/peps/pep-0008/#whitespace-in-expressions-and-statements –