LoginSignup
kiri___
@kiri___

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

挿入ソートのコードエラーを指摘していただきたい

解決したいこと

挿入ソートのコードを書いたのですが、エラーが出る為、修正箇所を教えて頂きたいです。

入力
8
102 345 233 576 11 3 798 222

このコードでの間違った出力
102 345 345 576 11 3 798 222
102 345 345 576 11 3 798 222
102 345 345 576 576 3 798 222
102 345 345 576 576 576 798 222
102 345 345 576 576 576 798 222
102 345 345 576 576 576 798 798

発生している問題・エラー

  File "/judge/Main.py", line 13, in <module>
    InsertSort(A,N)
  File "/judge/Main.py", line 4, in InsertSort
    while j > 1 and A[j] < A[j - 1]:
                    ~^^^
IndexError: list index out of range

該当するソースコード

  for i in range(2, N + 1):
    j = i
    while j > 1 and A[j] < A[j - 1]:
      tmp = A[j]
      A[j] = A[j - 1]
      j = j - 1
    print(*A)

N = int(input())    
A = list(map(int,input().split()))

InsertSort(A,N)

自分で試したこと

list index out of rangeなので、繰り返しの部分の範囲を変えてみましたが、出力結果は変わらず間違えていました。

0

1Answer

エラーが発生するのは

  for i in range(2, N + 1):
    j = i
    while j > 1 and A[j] < A[j - 1]:

i のレンジ が 2〜Nなので iがNの場合に jがNになって A[j]でAの配列の index 範囲をこえてるからです。( Aのindex は 0〜N-1まで )

def InsertSort(A,N): がコードからぬけてる事は考慮済みで指摘します

指摘1
i の開始が2からなので 比較開始配列の index 0番目と1番目の比較が対象から外れている。i の終了はN-1だから

-  for i in range(2, N + 1):
+  for i in range(1, N ):

指摘2
j の判断が2からなので index 0番目と1番目の比較が実行されない

-    while j > 1 and A[j] < A[j - 1]:
+    while j > 0 and A[j] < A[j - 1]:

指摘3
A[j]とA[j - 1]の入れ替えができていない

-      tmp = A[j]
-      A[j] = A[j - 1]
+      tmp = A[j]
+      A[j] = A[j - 1]
+      A[j - 1] = tmp

どうでしょう。

1

Comments

  1. @kiri___

    Questioner

    貼り付けの際、def文が抜け落ちてしまいました。
    全て直りました。ありがとうございます。お手間をおかけしました。

  2. 問題が解決したのでしたら、本問をクローズにしましょう。

Your answer might help someone💌