Schnelle Art Python

Schnelle Art Python
Quicksort ist ein beliebter Sortieralgorithmus, der häufig verwendet wird. In der ersten Hälfte dieses Beitrags werden wir einfache ganze Zahlen verwenden, aber wir zeigen, wie diese Technik anpassen kann, um Objekte einer benutzerdefinierten Klasse zu sortieren. Quicksort repräsentiert Divide-and-Conquer-, In-Place- und instabile Sortieralgorithmen. Bevor Sie die größeren Arrays rekursiv sortieren, teilen sich und erobern Sie das Array in kürzere Arrays, bis es ein leeres Array findet, sogar eines mit nur einem Eintrag. Das Array oder Unterästraum werden nicht dupliziert, wenn sie an Ort und Stelle verwendet werden. Alle rekursiven Aufrufe, die es jedoch macht, erfordern jedoch Stack -Speicher. Ein instabiler Sortieralgorithmus garantiert dies nicht. Es kann passieren, aber es ist nicht garantiert. Dies ist meistens relevant, wenn Objekte anstatt primitive Arten sortieren.

Beispiel 1:

Wir beginnen mit der Auswahl eines Pivot -Elements. Um alle Elemente in der Liste zu durchschleifen, verwenden wir Python für die Schleife. Wenn eine Zahl ist <= to the pivot, it is shifted to the left. Otherwise, it shifts to the right side of the pivot. Our Python program returns the new high value. Item + 1 equals the new high value. After that, we must execute our algorithm. A separate procedure can be created to achieve this. This function compares the values of “low_point” and “high_point” to test if “low_pont” is less than “high_point.” We'll be likely to progress if that's the case. Otherwise, our sorting will come to a halt. When our sorting comes to a halt, it signifies the list has been sorted.

Die Methode prepe () wird dann von unserem Code aufgerufen. Dies findet einen Drehzeiger und überträgt die Dinge an ihre richtigen Orte. Die QuickSort () -Methode wird somit zweimal von unserem Programm aufgerufen. Wir verwenden zum ersten Mal Quicksort auf den Teilen links vom Drehpunkt. Für den 2. Versuch verwenden wir Quicksort auf den Objekten rechts vom Drehpunkt. Infolgedessen ist unsere Funktion rekursiv, weil es sich selbst aufruft. Lassen Sie uns nun ein primäres Programm erstellen, das eine sortierbare Liste erstellt. Wir beginnen damit, eine Reihe von Werten zu sortieren, um zu sortieren. Die Funktion Python len () wird verwendet, um die Länge unseres Attributensatzes zu bestimmen. Danach wird die QuickSort () -Methode angewendet.

Def Prepe (Daten, Low_Point, High_Point):
pivot = data [High_point]
n = low_point - 1
für i in Bereich (Low_Point, High_Point):
Wenn Daten [i] <= pivot:
n = n + 1
(Daten [n], Daten [i]) = (Daten [i], Daten [n])
(Daten [N + 1], Daten [High_Point]) = (Daten [High_Point], Daten [N + 1])
Return N + 1
Def Quick_Sort (Daten, Low_Point, High_Point):
Wenn Low_Pointpivot = vorbereiten (Daten, Low_Point, High_Point)
Quick_Sort (Daten, Low_Point, Pivot - 1)
Quick_Sort (Daten, Pivot + 1, High_Point)
my_list = [9, 5, 1, 7, 4, 2]
Total = len (my_list)
Quick_Sort (My_List, 0, Gesamt - 1)
print (my_list)

Hier können Sie sehen, dass die Daten sortiert sind.

Beispiel 2:

Wir werden in diesem Beispiel zwei Funktionen verwenden: Partition () und QuickSort (). Die Funktion von QuickSort () verteilt sich zuerst die Sammlung und ruft sich dann rekursiv auf den partitionierten Teilen auf. Schauen wir uns zunächst die Funktion Division () an. Der Drehpunkt wurde zuerst festgelegt, wie Sie im Code sehen können. Wenn der Wert, den wir gerade betrachten, höher ist als der Drehpunkt. Wir können zum nächsten Stück links übergehen. Wir müssen auch sicherstellen, dass wir den niedrigen Zeiger nicht bestanden haben, was darauf hinweist. Danach wird die von der oben genannte Methode durchgeführt. Wir haben entweder eine außerordentliche Nummer für High_Point und Low_Point gefunden oder Low_Point ist größer als High_Point. In diesem Fall werden wir die Schleife verlassen. Lassen Sie uns schließlich den Code von QuickSort () in Aktion setzen. Wir können QuickSort () in einem Basisarray verwenden, um beide Funktionen (Partition und Quicksort) zu implementieren, um beide Funktionen zu implementieren, und Quicksort) implementieren.

Def Partition (arr1, Start, Ende):
pivot = arr1 [start]
low_point = start + 1
High_Point = Ende
während wahr:
während low_point = pivot:
High_Point = High_Point - 1
während low_point<= high_point and arr1[low_point] <= pivot:
low_point = low_point + 1
Wenn Low_Point = Ende:
zurückkehren
p_func = partition (arr1, start, Ende)
Quick_Sort (arr1, start, p_func-1)
Quick_Sort (arr1, p_func+1, Ende)
arr1 = [23,22,56,4,26,77,10,33,44,12,57,78,22,83,43,31,98,76]
Quick_Sort (arr1, 0, len (arr1) - 1)
drucken (arr1)

Dies ist das Ergebnis. Es gibt keine Garantie dafür, dass diese beiden 22er in dieser Reihenfolge waren, da die Methode instabil ist. Vielleicht wurden sie zunächst umgeschaltet, aber das bedeutet in einem Ganzzahl -Array nichts, was nichts betrifft.

Beispiel 3:

Wir werden in diesem Beispiel benutzerdefinierte Objekte sortieren. Es gibt verschiedene Möglichkeiten, diesen Algorithmus zu erweitern, um benutzerdefinierte Objekte in Python zu sortieren. Die Vergleichsbetreiber für eine bestimmte Klasse könnten in einem pythonischen Stil implementiert werden, was bedeutet, dass wir den Algorithmus nicht ändern müssten, weil>, ==, = usw., würde am besten für unser Klassenobjekt funktionieren. Eine weitere Option besteht darin, den Anrufer unserem Algorithmus mit einer Methode zur Verfügung zu stellen, die dann verwendet wird, um den tatsächlichen Artikelvergleich durchzuführen. Es ist ziemlich einfach, den Algorithmus für die Verwendung mit maßgeschneiderten Objekten neu zu schreiben. Denken Sie jedoch daran, dass der Algorithmus nicht vollständig stabil ist. Beginnen wir mit der Schülerklasse. Diese Klasse hat nur zwei Merkmale: den Namen und das Alter des Schülers. Wir werden nach Alter sortieren, was wir erreichen werden, indem wir dem Sortieralgorithmus eine neue Lambda -Funktion geben. Schauen wir uns zunächst an, wie diese Funktion im Algorithmus verwendet wird. Anstatt die Operatoren von = oder> = zu verwenden, um einen direkten Vergleich zu erzielen, verwenden wir die Funktion, um zu bestimmen, welcher Schüler älter ist. Lambda überträgt das Objekt im Vergleich zum schnellen Sortieraufruf, der den genauen Altersattributvergleich durchführt.

Klassenstudent:
def __init __ (self, name_of_student, Alter):
selbst.name_of_student = name_of_student
selbst.Alter = Alter
Def __str __ (Selbst):
Rückkehr selbst.Name des Studenten
Def Partition (arr1, Start, Ende, Compare_Func):
pivot = arr1 [start]
low_point = start + 1
High_Point = Ende
während wahr:
während low_point<= high_point and compare_func(arr1[high_point], pivot):
High_Point = High_Point - 1
während low_point<= high_point and not compare_func(arr1[low_point], pivot):
low_point = low_point + 1
Wenn Low_Point = Ende:
zurückkehren

Hier sehen Sie die sortierte Liste der Namen.

Abschluss:

Ein Array wird mit dem Python -Quicksort -Algorithmus unterteilt und dann jeden Eintrag in der Liste sortiert. Diese Methode ruft diese Sub -Arrays wiederholt auf. Wir haben dieses Konzept mit Beispielen in diesem Artikel ausführlich durchgemacht.