###実現したいこと
マージソートを完成させたいです。
再帰で分割、併合をしています。
###問題点
下記のようなエラーが出ます。
list index out of range
これは、配列の外を参照しているという意味だと認識しています。
どうしてそうなるのか考えるためリストを可視化するサイトで見てみました。すると、再帰を繰り返し過ぎて最終的にリストLan
とRan
の中身が空っぽになっていました。だからmerge(Lan,Ran)
をしようがなくなってしまったのだと思います。
再帰を繰り返し過ぎない方法はないでしょうか。いろいろなマージソートのサンプルコードを見ていますがよくわかりません。
アドバイスをお願いします!
7 2 8 5 3 2 1 Traceback (most recent call last): File "kadai07c.py", line 48, in <module> mdiv(a) File "kadai07c.py", line 18, in mdiv Lan=mdiv(L) File "kadai07c.py", line 20, in mdiv return merge(Lan,Ran) File "kadai07c.py", line 30, in merge if L[0]<R[0]: #二つの配列を見比べたときにL[0]が大きかったら IndexError: list index out of range
###コード
python
1#分割 2def mdiv(a): 3 n=len(a) 4 l=0 5 r=n 6 if n==1: #そのまま出力 7 return a 8 else: 9 mid=(l+r)//2 #分割した右端+左端 10 print(mid) 11 L=a[0:mid] #0~midまでの値を入れる 12 R=a[mid:n] #mid~最後までの値を入れる 13 #print("L=",L) 14 #print("R=",R) 15 #再帰的に分割 16 Lan=mdiv(L) 17 Ran=mdiv(R) 18 return merge(Lan,Ran) 19 20#併合 21def merge(L,R): 22 sort=[] 23 nL=len(L) #リストLのデータ数 24 nR=len(R) #リストRのデータ数 25 26 #比較 27 while (nL>0) and (nR>0): #リストLとリストRのデータ数が0になるまで繰り返す 28 if L[0]<R[0]: #二つの配列を見比べたときにL[0]が大きかったら 29 sin=L[0] 30 sort.append(sin) 31 del L[0] #L[0]を削除 32 else: ##二つの配列を見比べたときにR[0]が大きかったら 33 sin=R[0] 34 sort.append(sin) 35 del R[0] #R[0]を削除 36 37 return sort 38 39 40 41a=[] #リスト 42#リストに入力していく 43a=[int(i) for i in input().split()] 44n=len(a) #リストの数 45 46mdiv(a) 47 48#print(a)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/13 08:16
2020/11/13 08:19
2020/11/15 02:18