我尝试在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
我有一个错误: Traceback(最近一次调用最后一次): 在test_sort中输入第6行的“insertion.py” self.assertEqual(sort([5,2,6,3,7]),[2,3,5,6,7]) 文件“insertion.py”,第12行,排序 key = a [i] IndexError:列表索引超出范围
我的sort()代码是:
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
如果我更改了range()调用的参数:
for i in range( 2, len_a )
...然后我的结果不正确:
[5, 2, 3, 6, 7]
我的代码是错误的还是在article无效的algorythm?
更新
我更改了代码(使用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,2,3,6,7]
分辨率。
我们找到了解决方案:
while j and a[ j ] > key
应该
while j >= 0 and a[ j ] > key
答案 0 :(得分:4)
[5, 2]
也不起作用。如果你只是检查while j (>0)
,你就不会移动第一个项目。
我认为这有效
while j >= 0 and a[ j ] > key:
答案 1 :(得分:2)
Python使用基于0的索引,使a[len(a)]
超出范围。伪代码使用基于1的索引。
您需要将两个指数减少一个:
len_a = len(a)
for i in range(1, len_a):
和
while j >= 0 and a[j] > key: