Rask sorter Python

Rask sorter Python
Quicksort er en godt likt sorteringsalgoritme som ofte brukes. I første halvdel av dette innlegget bruker vi enkle heltall, men vi viser hvordan du kan tilpasse denne teknikken til å sortere objekter i en tilpasset klasse. Quicksort representerer split-og-erobre, på stedet og ustabile sorteringsalgoritmer. Før du rekursivt sorterer de større matriser, deler du og erobrer delen inn i kortere matriser til den finner en tom matrise, til og med en med bare en oppføring. Arrayen eller noen subarrays er ikke duplisert når det brukes på plass. Imidlertid nødvendiggjør alle de rekursive samtalene det ringer stabelen til stabelen. En ustabil sorteringsalgoritme garanterer ikke dette; Det kan skje, men det er ikke garantert. Dette er stort sett relevant når du sorterer objekter i stedet for primitive typer.

Eksempel 1:

Vi begynner med å velge et pivotelement. Deretter, for å sløyfe gjennom alle elementene på listen, bruker vi Python for loopen. Hvis et nummer er <= 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.

Forberedelsesmetoden kalles deretter av koden vår. Dette lokaliserer en pivotpeker og overfører ting til deres rette steder. QuickSort () -metoden kalles således to ganger av vårt program. Vi bruker Quicksort på brikkene til venstre for pivoten for første gang. For det andre forsøket bruker vi Quicksort på objektene til høyre for pivot. Som et resultat, fordi det kaller seg, er vår funksjon rekursiv. La oss nå lage et primært program som oppretter en sorterbar liste. Vi begynner med å spesifisere et sett med verdier for å sortere. Python Len () -funksjonen brukes til å bestemme lengden på vårt attributter. Etter det brukes Quicksort () -metoden.

def forberedelse (data, low_point, high_point):
pivot = data [high_point]
n = low_point - 1
for jeg i rekkevidde (low_point, high_point):
Hvis data [i] <= pivot:
n = n + 1
(data [n], data [i]) = (data [i], data [n])
(Data [n + 1], data [high_point]) = (data [high_point], data [n + 1])
Return n + 1
def Quick_sort (data, low_point, high_point):
Hvis Low_pointpivot = forberedelse (data, low_point, high_point)
Quick_sort (data, low_point, pivot - 1)
Quick_sort (data, pivot + 1, high_point)
my_list = [9, 5, 1, 7, 4, 2]
Totalt = Len (My_List)
QUICK_SORT (MY_LIST, 0, TOTAL - 1)
print (my_list)

Her kan du se at dataene er sortert.

Eksempel 2:

Vi bruker to funksjoner i dette eksemplet: partisjon () og Quicksort (). QuickSort () -funksjonen partisjonerer samlingen først, og ringer seg deretter rekursivt på de partisjonerte stykkene. La oss først se på divisjonsfunksjonen (). Pivoten ble satt først, som du kan se i koden. Hvis verdien vi ser på akkurat nå, er høyere enn pivoten. Vi kan gå videre til neste stykke til venstre fordi det er på høyre side av pivoten. Vi må også sørge for at vi ikke har passert den lave pekeren, noe som indikerer at alle elementer er blitt flyttet til riktig side av pivoten. Etter det blir metoden motsatt av den ovenfor utført. Vi har enten funnet et out-of-order-nummer for både high_point og low_point, eller low_point er større enn high_point, i så fall vil vi forlate løkken. Til slutt, la oss sette Quicksort () -koden ut i handling. Vi kan bruke Quicksort () på et grunnleggende utvalg for å implementere begge funksjonene (Partition og Quicksort).

def partisjon (arr1, start, slutt):
pivot = arr1 [start]
low_point = start + 1
high_point = slutt
Mens sant:
Mens Low_Point = Pivot:
high_point = high_point - 1
Mens Low_point<= high_point and arr1[low_point] <= pivot:
low_point = low_point + 1
Hvis low_point = slutt:
komme tilbake
p_func = partisjon (arr1, start, slutt)
Quick_sort (arr1, start, p_func-1)
Quick_sort (arr1, p_func+1, slutt)
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)
Print (ARR1)

Dette er resultatet. Det er ingen garanti for at disse to 22 -årene var i denne rekkefølgen fordi metoden er ustabil. Kanskje de ble byttet med det første, men det innebærer ikke noe i et heltallsarray.

Eksempel 3:

Vi skal sortere tilpassede objekter i dette eksemplet. Det er flere forskjellige måter å utvide denne algoritmen for å sortere tilpassede objekter i Python. Sammenligningsoperatørene for en spesifikk klasse kan bli implementert i en pytonisk stil, noe som betyr at vi ikke trenger å endre algoritmen fordi>, ==, =, etc., ville fungere best på klasseobjektet vårt. Ett alternativ er å få den som ringer til å gi vår algoritme en metode, som deretter vil bli brukt til å utføre den faktiske sammenligningen. Det er ganske enkelt å omskrive algoritmen for bruk med skreddersydde objekter. Husk imidlertid at algoritmen ikke er helt stabil. La oss begynne med studentklassen. Denne klassen har bare to egenskaper: studentens navn og alder. Vi sorterer etter alder, som vi oppnår ved å gi sorteringsalgoritmen en ny lambda -funksjon. Men først, la oss se på hvordan denne funksjonen brukes i algoritmen. I stedet for å bruke = eller> = operatører for å gjøre en direkte sammenligning, bruker vi funksjonen for å bestemme hvilken student som er eldre. Lambda overfører objektet sammenlignet med den raske sorteringssamtalen, som gjør den eksakte aldersattributtet sammenligning.

Klasseelev:
def __init __ (selv, name_of_student, alder):
selv-.name_of_student = name_of_student
selv-.alder = alder
def __str __ (selv):
Returnerer selv.navn på student
def partisjon (arr1, start, slutt, sammenlign_func):
pivot = arr1 [start]
low_point = start + 1
high_point = slutt
Mens sant:
Mens Low_point<= high_point and compare_func(arr1[high_point], pivot):
high_point = high_point - 1
Mens Low_point<= high_point and not compare_func(arr1[low_point], pivot):
low_point = low_point + 1
Hvis low_point = slutt:
komme tilbake

Her kan du se den sorterte listen over navn.

Konklusjon:

En matrise er inndelt ved hjelp av Python Quicksort -algoritmen og sorter deretter hver oppføring på listen; Denne metoden kaller disse undergruppene gjentatte ganger. Vi har gått gjennom dette konseptet i dybden med eksempler i denne artikkelen.