2012-07-28 9 views
5

Ziemlich verwirrt darüber, weil ich korrekte logische Ausgabe für klein genug Testfälle (N = 20) verifiziert habe. Ich versuche N = 10.000 Zahlen zu machen und das Programm hängt einfach und ich verstehe nicht warum ... Ich habe den Algorithmus so einfach wie möglich implementiert.QuickSort in Python - Programm hängt für größere Eingabegrößen?

Auch Aufruf sorted(data) auf meiner N = 10k Liste scheint fast sofort zu funktionieren. Ich bin also überzeugt, dass mein Algorithmus irgendwo stecken bleibt. Hier

ist der Code:

def QuickSort(array): 
    qsort(array, 0, len(array)) 


def qsort(arr, left, right): 
    if ((right - left) < 2): 
     return 

    pivotIndex = choosePivot0(arr, left, right) 

    newPivotIndex = partition(arr, pivotIndex, left, right) 

    qsort(arr, 0, newPivotIndex) 
    qsort(arr, newPivotIndex + 1, right) 

def partition(arr, pivotIndex, left, right): 
    swap(arr, pivotIndex, left) 
    pivot = arr[left] 
    i = left + 1 
    for j in range(left+1, right): 
     if (arr[j] < pivot): 
      swap(arr, i, j) 
      i = i + 1 

    swap(arr, left, i-1) #put pivot back where it belongs 
    #cobj.count = cobj.count + (right - left - 1) #add m-1 the #of comparisons 
    return (i-1) #give back where the pivot resides 



def swap(array, i, j): 
    temp = array[i] 
    array[i] = array[j] 
    array[j] = temp 

def choosePivot0(array, left, right): 
    return randint(left, right-1) #random 

Also ich bin ziemlich verloren, warum dies geschehen könnte. Danke für jede Hilfe.

+1

Wie lange hat Ihr Code benötigt, um 10k-Daten zu sortieren? Ich implementierte einen sehr einfachen qsort und 'sys.setrecursionlimit (2 ** 30)', es dauert ungefähr 20 ~ 30 Sekunden, um '[2, 3, 5] * 10000', ein 30k-Daten, zu sortieren. – xiaowl

Antwort

5

Es scheint ein Tippfehler in der folgenden Zeile zu sein:

qsort(arr, 0, newPivotIndex) 

ich denke, es so sein sollte.

qsort(arr, left, newPivotIndex) 

Sonst funktioniert die Funktion irgendwie nur für einige der Eingabedatensätze. Deshalb bleibt der Algorithmus hängen.

+0

Sie sind jetzt meine Lieblings Person. Vielen Dank, das behebt es. – JDS

2

Hinweis: Ich habe Ihren Algorithmus nicht überprüft, daher könnte es ein Problem damit geben/python mag es aus irgendeinem Grund nicht, aber: Schnelle Sortierung verbessert die Sortierzeit von N^2 zu N log (N) , aber vielleicht so schlecht wie N^2 abhängig von Eingabedaten. Bei optimalen Daten wäre N = 10.000 im Vergleich zu N = 20 ein Faktor von 40.000/26 = 1538 mal langsamer. Vielleicht ist es nur Verarbeitung?

Mit Worst-Case-Daten wird es 100.000.000/400 = 25.000 mal langsamer. Was sind deine Daten?

+1

Nur einmal in einem blauen Mond würde ich N^2 Laufzeit Komplexität von QuickSort mit einem zufälligen Pivot erwarten. Daten sind nur eine generische Liste der Ganzzahlen 1 bis 10000 in unsortierter Reihenfolge. – JDS

+0

Frage nur, wenn Sie es nicht mit RDD-Daten liefern. – AJP

2

Python hängt oft für tief rekursive Funktionen, manchmal beendet es nur die aktuelle Sitzung (wenn Sie es in IDLE ausprobieren) und startet eine neue Sitzung, ohne überhaupt eine Ausgabe zu geben. Versuchen Sie dies: import sys; sys.setrecursionlimit(2**30), das kann helfen, wenn auch nicht immer.

+0

Danke, werde das versuchen. – JDS