Python で次の疑似コードを実装しようとしています (挿入ソートのロシアのページから):
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 (most recent call last): File "insertion.py", line 6, in test_sort self.assertEqual( sort( [ 5, 2, 6, 3, 7 ] ), [ 2, 3, 5 , 6, 7 ] ) ファイル "insertion.py"、12 行目、ソート キー = 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]
私のコードは間違っていますか、それとも記事のアルゴリズムが不正確ですか?
更新します。
コードを変更しました (0-indexed 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