2017-05-14 2 views
0

私はPythonが初めてです。整数値を昇順でソートするためのクイックソートのコードを書いた。範囲外のリストインデックスが、私は同じ入力と同じコードを実行した場合、それは正しい出力を与える: - Ubuntuの16.10とpython3.5Python 3.4で同じ入力サイズの同じコードで複数の時間を実行した後、IndexErrorがスローされません:リストインデックスが範囲外です

コード -

import random 

a=[] 
n=int(input("Enter size :\n")) 
for i in range(0,n): 
     a.append(int(random.randrange(0,100))) 
print("Before Sorting:",a) 

def quick(a,low,high): 
     if(low<high): 
       i=low 
       j=high 
       key=a[low] 
       flag=1 
       while (flag==1): 
         i += 1 
         while(a[i]<key): 
           i += 1 
         while (a[j]>key): 
           j -= 1 
         if (i<j): 
           a[i],a[j]=a[j],a[i] 
         else: 
           flag=0 
       a[low],a[j]=a[j],a[low] 
       quick(a,low,j-1) 
       quick(a,j+1,high) 

# Calling function quick where a = List, 0 = Start Index ,n-1 = Last Index 
quick(a,0,n-1) 
print("After Sorting:",a) 

私は、コードを実行すると、それははIndexErrorをスローを使用して 。例えば - N = 5

Enter size : 
5 
Before Sorting : [6, 5, 93, 84, 32] 
Traceback (most recent call last): 
    File "quick.py", line 30, in <module> 
    quick(a,0,n-1) 
    File "quick.py", line 27, in quick 
    quick(a,j+1,high) 
    File "quick.py", line 17, in quick 
    while(a[i]<key): 
    IndexError: list index out of range 

を用いて3回目のコードを実行して2回目のコードを実行してN = 5

[email protected]:~/PYTHON/practice/run1$ python3 quick.py 
Enter size : 
5 
Before Sorting : [55, 23, 57, 86, 20] 
Traceback (most recent call last): 
    File "quick.py", line 30, in <module> 
    quick(a,0,n-1) 
    File "quick.py", line 27, in quick 
    quick(a,j+1,high) 
    File "quick.py", line 17, in quick 
    while(a[i]<key): 
    IndexError: list index out of range 

と1回目のコードを実行し、N = 5

[email protected]:~/PYTHON/practice/run1$ python3 quick.py 
Enter size : 
5 
Before Sorting : [87, 18, 94, 1, 64] 
After Sorting : [1, 18, 64, 87, 94] 

これはなぜ発生するのかわかりません。 私はUbuntuの16.10とpython3.5

+0

問題があなたのソートにあります。 ubuntu 16.10やpython 3.5では問題ありません。あなたのデータはランダムですので、例外が発生しない場合もあります – mohammad

答えて

-1
import random 

a=[] 
n=int(input("Enter size :\n")) 
for i in range(0,n): 
    a.append(int(random.randrange(0,100))) 
print("Before Sorting:",a)  

def sort(a): 
    less = [] 
    equal = [] 
    greater = [] 

    if len(a) > 1: 
     pivot = a[0] 
     for x in a: 
      if x < pivot: 
       less.append(x) 
      if x == pivot: 
       equal.append(x) 
      if x > pivot: 
       greater.append(x) 
     return sort(less)+equal+sort(greater) 
    else: 
     return a 

a = sort(a) 
print("After Sorting:",a) 
0

コードが時々動作し、時にはない理由を使用していますと、あなたは数字のランダムな配列を設定していることです。あなたの投稿が示すように、同じ入力データ(リストの長さ)であっても、その数は毎回異なります。 quick()関数は、一部の入力データで機能し、他の入力データで失敗します。 a[i]<keyai-1の要素があると仮定しているため、データに応じて失敗することがあります。

以下の修正により、範囲外のエラーはなくなります。私は数十回それを実行し、結果は大丈夫と思われる。私はコードがクイックソートの正しい実装だと約束することはできません。

def quick(a,low,high): 
     if(low<high): 
       i=low 
       j=high 
       key=a[low] 
       flag=1 
       while (flag==1): 
         i += 1 
         while(i < len(a) and a[i]<key): 
           i += 1 
         while (j < len(a) and a[j]>key): 
           j -= 1 
         if (i<j): 
           a[i],a[j]=a[j],a[i] 
         else: 
           flag=0 
       a[low],a[j]=a[j],a[low] 
       quick(a,low,j-1) 
       quick(a,j+1,high) 
関連する問題