2017-05-14 2 views
0

Ich bin neu in Python. Ich habe einen Code geschrieben, um ganze Zahlen in aufsteigender Reihenfolge sortieren zu können. Verwendung - Ubuntu 16.10 und python3.5Nach mehrmaliger Ausführung mit gleichem Code mit gleicher Eingabegröße in Python 3.4 wird IndexError nicht geworfen: list index out of range

-Code -

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) 

Wenn ich den Code ausführen wirft es Indexerror: Listenindex außerhalb des zulässigen Bereichs, aber wenn ich den gleichen Code mit gleichem Eingang laufen gibt es eine korrekte Ausgabe . Zum Beispiel - den Code für 1.es Mal mit n = Laufe 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 

für 2.es Mal den Code Laufen mit 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 

mit dem Code für die 3. Laufzeit 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] 

Ich bin nicht in der Lage, herauszufinden, warum das passiert. Ich bin mit Ubuntu 16.10 und python3.5

+0

Problem ist mit Ihrem Algo zu sortieren! Es gibt kein Problem in Ubuntu 16.10 oder Python 3.5. Ihre Daten sind zufällig, so dass in einigen Fällen keine Ausnahme auftritt – mohammad

Antwort

-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

Der Grund manchmal Ihr Code funktioniert und manchmal tut, ist nicht, dass Sie eine zufällige Anordnung von Zahlen einrichten. Wie Ihr Beitrag zeigt, sind die Zahlen bei gleichen Eingabedaten (Länge der Liste) jedes Mal unterschiedlich. Ihre quick() Funktion arbeitet mit einigen Eingabedaten und schlägt mit anderen Eingabedaten fehl. Es schlägt fehl, weil a[i]<key davon ausgeht, dass i-1 Elemente in a sind und abhängig von Ihren Daten manchmal nicht sind.

Die unten angegebene Fehlerbehebung führt dazu, dass der Fehler außerhalb des zulässigen Bereichs verschwindet. Ich habe es ein paar Dutzend Mal ausgeführt und die Ergebnisse scheinen in Ordnung zu sein. Ich kann jedoch nicht versprechen, dass der Code eine korrekte Implementierung von Quicksort ist.

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) 
Verwandte Themen