2017-08-14 1 views
0

ソートされるリストに512個以上の要素がある場合に失敗するマージソートの実装でPythonで作業しています。リストのインデックスが512個を超えるマージソートのときにエラーが発生する

関連するコードは、以下である:

def mergeSort(oldList): 
    if len(oldList) > 1: 
     list1 = mergeSort(oldList[:len(oldList)/2]) 
     list2 = mergeSort(oldList[len(oldList)/2:]) 
     newList = merge(list1, list2) 
     return newList 
    else: 
     return oldList 

def merge(list1, list2): 
    newList = [] 
    i = 0 
    j = 0 
    while(len(list1) > i or len(list2) > j): 
     print i, j 
     if len(list1) is i: 
      newList.append(list2[j]) 
      j = j + 1 
     elif len(list2) is j: 
      newList.append(list1[i]) 
      i = i + 1 
     elif list1[i] > list2[j]: 
      newList.append(list2[j]) 
      j = j + 1 
     else: 
      newList.append(list1[i]) 
      i = i + 1 
    return newList 

unsortedList = [ randint(0,100) for i in range(513) ] 
mergeSortedList = mergeSort(unsortedList) 

私は小さい整数の最後の行の次に513を変更すると予想されるように、コードが動作します。 513で始まる、私は次のエラーを取得する:

File "./sortcomparison.py", line 129, in merge

elif list1[i] > list2[j]: 

IndexError: list index out of range

+0

より多くの私は(リスト1)lenの場合 '変更することでこの問題を解決することができた私です:'と 'のelif LEN(LIST2)がjである:' lenの場合は '(リスト1)== i: 'と' elif len(list2)== j: 'となります。誰かがその2つの違いを説明でき、なぜそれが元のコードと壊れたコードになったのでしょうか? – mdf730

+0

Pythonでは 'is'は両方の変数が同じオブジェクトを指しているかどうかをチェックしますが、' == '記号は2つの変数の値が同じかどうかをチェックします。 – GeekSambhu

答えて

0

コードが失敗した場合、あなたがマージ機能にif elseブロックの周りtry exceptブロックを追加することができます参照してください。

エラーを解決するには、merge機能でis==に置き換えます。

isは、2つの変数が同じオブジェクトを参照しているかどうかを比較するために使用され、==が等価性の検査に使用されます。このhere

関連する問題