前提・実現したいこと
最近プログラミングを始めて、アルゴリズムについて勉強しています。並べ替えの問題を勉強中にわからないことが起こったので質問しました。
発生している問題・エラーメッセージ
挿入ソートについて学んだので自分なりにコードを書いたのですが、結果が出力されずエラーも出ないのでどこに問題があるのかがわかりませんでした。
追記:
質問してくれた方々のおかげで、自分のコードが冗長になっていることが分かったので、追記に書かれているように修正したところ問題なく動作しました。ですが元のコードがなぜダメなのかがわかりません。よろしければご教授ください。
エラーメッセージ
該当のソースコード
python
1data=[6,15,4,2,8,5,11,9,7,13] 2 3for i in range(len(data)): 4 temp=data[i] 5 j=i 6 if j!=0: 7 while temp<data[j-1]: 8 if j==0: 9 pass 10 else: 11 data[j]=data[j-1] 12 j-=1 13 data[j]=temp 14 15print(data) 16
###追記
python
1data=[6,15,4,2,8,5,11,9,7,13] 2 3for i in range(len(data)): 4 temp=data[i] 5 j=i 6 if j!=0: 7 while temp<data[j-1] and j!=0: 8 data[j]=data[j-1] 9 j-=1 10 11 data[j]=temp 12 13print(data) 14
補足情報(FW/ツールのバージョンなど)
verion:python(3.9.2)
OS:Windows11
idle, jupyter notebook で試しました
indentをつけていないのにエラー出ていませんか。
紛らわしくてごめんなさい。自分も今気づきましたが、こっちのページにコピーするときにインデントが抜けたのだと思います。もともと実行したときはインデントはつけていたのでエラーは出ませんでした。
編集しました。ご指摘ありがとうございます!!
どのような挿入ソートの問題ですか?
どのような意図で
pass
を使っていますか。
>Hyugopythonさん
数を要素に持つリストを小さい順に並べるソートです。このアルゴリズムではある値を別のところに格納して、その値よりも大きくて取り出した要素よりも手前にあるものをずらしていくというのを順次行って小さい順にソートしようとしています。
>1T2R3M4さん
jが0だとリストの-1番目を取り出す作業を行わせてしまい、エラーが出るのでそれを避けるためです。jが0になればそれ以上前の要素がないので。
↑のコメントを書いていて気づきましたが、
if j==0:
pass
else:
data[j]=data[j-1]
j-=1
のところは、
if j!=0:
data[j]=data[j-1]
j-=1
で良い気がします。すいません。
pass
より
break
が適切な気がします。
追記コード見る前に書いたので無視してください。
ご指摘ありがとうございます。試しに元のコードの
pass
を
break
に変えてみたところ上手くいきました。
おそらく pass と while ループの組み合わせで無限ループが起こっていたのだと思います。わざわざ相談に乗ってくださってありがとうございます!!
敢えてこのコードで書いておるのであれば、申し訳ないのですが、
pythonにはデフォルトの組み込み関数にsorted関数やsort関数があるのでそれ使えば一瞬で昇順降順にソートできます。
回答1件
あなたの回答
tips
プレビュー