Innledning
noen Ganger, data vi lagrer eller hente i et program kan ha liten eller ingen ordre. Vi kan ha for å omorganisere data for å riktig behandle den eller effektivt bruke det. Gjennom årene, datamaskinen forskere har skapt mange sorterings-algoritmer for å organisere data.
I denne artikkelen vil vi ta en titt på den populære sorterings-algoritmer, forstår hvordan de fungerer og kode dem i Python. Vi vil også sammenligne hvor raskt de sorter elementer i en liste.,
For enkelhet, algoritme-implementeringer ville være sortering av lister med tall i stigende rekkefølge., Selvfølgelig, er du fri til å tilpasse dem til dine behov
Hvis du ønsker å lære om en bestemt algoritme, kan du hoppe til det her:
- Boble Sortere
- Sorter Utvalget
- Innsetting Sortere
- slå sammen Sortere
- Heap Sortere
- Rask Sortere
- Sortering i Python
Boble Sortere
Denne enkle sortering algoritme koden over en liste, sammenligning av elementer i par og bytte dem til større elementer «boble opp» til slutten av listen, og mindre elementer opphold på «bunnen».,
Forklaring
Vi begynner med å sammenligne de to første elementene i listen. Hvis det første elementet er større enn det andre elementet, vi bytte dem. Hvis de er allerede i rekkefølge vi la dem være som de er. Vi vil deretter gå til neste par elementer, sammenligne sine verdier og bytt om nødvendig. Denne prosessen fortsetter til de siste par av elementene i listen.
Ved å nå slutten av listen, det gjentar denne prosessen for hvert element. Skjønt, dette er svært ineffektiv. Hva om du bare et enkelt bytte behov for å være laget i matrisen?, Hvorfor ville vi fortsatt gå om det n^2 ganger, selv om det er allerede sortert?
Selvfølgelig, for å optimalisere algoritmen, må vi stoppe det når det er ferdig sortering, ellers vil revurdere en allerede sortert array mange ganger.
Hvordan vil vi vite at vi er ferdig med å sortere? Hvis elementene var i orden da vi ikke ville ha til å bytte noen. Så, når vi bytte verdier vi setter et flagg True
for å gjenta sortering prosessen. Hvis ingen swaps oppstått, flagget ville forbli False
og algoritmen vil stoppe.,
Implementering
Med optimalisering, vi kan implementere Boble Sortere i Python som følger:
algoritmen kjører i en while
loop, bare bryte når ingen elementer er byttet. Vi set swapped
til True
i begynnelsen for å sikre at algoritmen kjøres minst én gang.
Tid Kompleksitet
I verste tilfelle scenario (når listen er i motsatt rekkefølge), denne algoritmen ville ha til å bytte hver enkelt element i matrisen., Våre swapped
flagget skulle være satt til True
på hver iterasjon.
Derfor, hvis vi har n elementer i vår liste, ville vi ha n iterasjoner per element – dermed Boble-Sortering er på tide kompleksiteten er O(n^2).
Sorter Utvalget
Denne algoritmen segmenter listen i to deler: sortert og usortert. Vi jobber kontinuerlig for å fjerne det minste elementet i den usorterte delen av listen og legge den til den sortert segmentet.,
Forklaring
I praksis, vi trenger ikke å opprette en ny liste for sortert elementer, hva vi gjør er å behandle den venstre delen av listen som sortert segmentet. Vi søker hele listen for de minste elementene, og bytte det med det første elementet.
Nå vet vi at det første elementet på listen er sortert, får vi det minste elementet av de gjenværende elementene og bytte det med andre element. Dette gjentar til det siste elementet på listen er de gjenværende element for å bli undersøkt.,
Implementering
Vi se at så i
øker, må vi trenger å sjekke mindre elementer.
Tid Kompleksitet
Vi kan lett få tid kompleksitet ved å undersøke for
looper i Utvalget Sortere algoritme. For en liste med n elementer, den ytre løkken koden n ganger.
Den indre sløyfen gjentas n-1 når jeg er lik 1, og deretter n-2 som jeg er lik 2 og så videre.
mengden av sammenligninger er (n - 1) + (n - 2) + ... + 1
, som gir Utvalget Sortere en gang kompleksitet O(n^2).,
Innsetting Sortere
Som Utvalget Sortere, denne algoritmen segmenter listen i sortert og usortert deler. Den koden over usortert segmentet, og setter inn et element som vises i riktig posisjon for den sorterte listen.
Forklaring
Vi anta at det første elementet på listen er sortert. Vi vil deretter gå til neste element, la oss kalle det x
. Hvis x
er større enn det første elementet vi la det være som det er., Hvis x
er mindre, vi kopierer verdien av det første elementet til andre posisjon, og deretter angi det første elementet x
.
Som vi går til andre deler av usortert segmentet, vi arbeider kontinuerlig med å flytte større elementer i sortert segment opp på listen før vi støter på et element mindre enn x
eller når slutten av sortert segmentet, og deretter plassere x
i riktig posisjon.
Hvis du ønsker å lese en detaljert, dedikert artikkel for Innsetting Sorter, vi har det du trenger!,
Implementering
Tid Kompleksitet
I verste fall, en rekke ville være sortert i omvendt rekkefølge. Den ytre for loop
i Innsetting Sortere funksjonen alltid-koden for n-1 ganger.
Heap Sortere
Denne populære sortering algoritme, som Innsetting og Utvalget slags, segmenter listen i sortert og usortert deler. Den konverterer den usorterte delen av listen til en Haug data struktur, slik at vi effektivt kan avgjøre det største elementet.,
Forklaring
Vi begynner med å transformere listen til en Maks Haugen – et Binært Tre hvor de største element er rotnoden. Vi legg det elementet til slutten av listen. Vi så gjenoppbygge vår Maks Haug som nå har en mindre verdi, plassere den nye størst verdi før det siste elementet i listen.
Vi gjenta denne prosessen med å bygge haugen til alle nodene er fjernet.
Hvis du ønsker å lese en detaljert, dedikert artikkel for Haugen Sorter, vi har det du trenger!,
Implementering
Vi vil opprette en hjelpefunksjon heapify
for å implementere denne algoritmen:
Tid Kompleksitet
La oss først se på den tid kompleksitet heapify
funksjon. I verste fall det største elementet er aldri rot-element, dette fører til en rekursive kall til heapify
. Mens rekursiv samtaler kan virke dauntingly dyrt, husk at vi jobber med et binært tre.
Visualisere et binært tre med 3 elementer, den har en høyde på 2., Nå visualisere et binært tre med 7 elementer, den har en høyde på 3. Treet vokser logaritmisk til n. heapify
funksjon som går gjennom treet i O(log(n)) tid.
heap_sort
funksjon koden over matrisen n ganger. Derfor er den totale tiden kompleksiteten av Haugen Sortere algoritmen er O(nlog(n)).
slå sammen Sortere
Denne splitt og hersk-algoritmen deler en liste i to, og holder dele listen med 2 før det har bare entall elementer.,
Tilstøtende elementer blir sortert par, deretter sortert par er slått sammen og sortert med andre par også. Denne prosessen fortsetter inntil vi får en sortert liste med alle elementer av usortert input-listen.
Forklaring
Vi undermapper delt listen i to før vi har lister med størrelse en. Vi flett hver halvdel som var delt, sortere dem i prosessen.
Sortering er utført ved å sammenligne det minste elementer av hver halvdel. Det første elementet i hver liste er den første til å bli sammenlignet. Hvis den første halvdelen begynner med en mindre verdi, så vi legger til at den sorterte listen., Vi så sammenligne den nest minste verdien av første halvår med den første minste verdien av den andre halvparten.
Hver gang velger vi mindre verdi ved begynnelsen av et halvt år, vi flytter indeksen som element behov for å bli sammenlignet med en.
Hvis du ønsker å lese en detaljert, dedikert artikkelen for å slå sammen Sorter, vi har det du trenger!
Implementering
Merk at merge_sort()
funksjon, i motsetning til den forrige sorterings-algoritmer, returnerer en ny liste som er sortert, snarere enn å sortere den eksisterende listen.,
Derfor, Fusjonere Sortere krever plass til å opprette en ny liste som er av samme størrelse som input-listen.
Tid Kompleksitet
La oss først se på merge
funksjon. Det tar to lister, og koden n ganger, der n er størrelsen av deres samlede innspill.
merge_sort
funksjon deler sine gitte utvalg i 2, og undermapper sorterer sub-matriser. Som input blir recursed er halvparten av hva som ble gitt, som binære trær dette gjør at tiden det tar å behandle vokse logaritmisk til n.,
Derfor er den totale tiden kompleksiteten av Merge Sortere algoritmen er O(nlog(n)).
Rask Sortere
Denne splitt og hersk-algoritmen er den mest ofte brukt sortering algoritme som dekkes i denne artikkelen. Når konfigurert på riktig måte, er det ekstremt effektiv og krever ikke ekstra plass Fusjonere Sortere bruker. Vi partisjon listen rundt en pivot-element, sortering verdier rundt pivot.
Forklaring
Rask Sortere begynner ved oppdeling listen – som å plukke en verdi av listen som vil være i sin sortert plass. Denne verdien kalles en pivot., Alle elementer som er mindre enn pivot er flyttet til venstre. Alle større elementer er flyttet til sin rett.
å Vite at pivot er i det rettmessige plass, vi undermapper sortere verdier rundt pivot til hele listen er sortert.
Hvis du ønsker å lese en detaljert, dedikert artikkel for Rask Sorter, vi har det du trenger!
Implementering
Tid Kompleksitet
Den verste tilfelle scenario er når den minste eller største elementet er alltid valgt som pivot. Dette ville opprette partisjoner av størrelse n-1, forårsaker rekursiv anrop n-1 ganger., Dette fører oss til et verste tilfelle tid kompleksitet O(n^2).
Selv om dette er en forferdelig verste fall, Rask Sortering er mye brukt fordi det er gjennomsnittlig tid kompleksitet er mye raskere. Mens partition
funksjon bruker nestede while
loops, det gjør sammenligninger på alle elementene i matrisen for å gjøre sine bytter. Som sådan, det har en tid kompleksitet O(n).
Med en god pivot, Rask Sortere funksjon ville partisjon matrisen inn i halvdeler som vokser logaritmisk med n. Derfor den gjennomsnittlige tiden kompleksitet Rask Sortere algoritmen er O(nlog(n)).,
Python ‘ s Innebygde Sortere Funksjoner
Mens det er gunstig å forstå disse sorterings-algoritmer, i de fleste Python-prosjekter ville du sannsynligvis bruke sortere funksjoner som allerede er fastsatt i språket.,
Vi kan endre vår liste for å ha det innholdet sortert med sort()
metode:
apples_eaten_a_day = apples_eaten_a_day.sort()print(apples_eaten_a_day) #
Eller vi kan bruke sorted()
funksjon for å opprette en ny liste sortert:
apples_eaten_a_day_2 = sorted_apples = sorted(apples_eaten_a_day_2)print(sorted_apples) #
De begge sorter i stigende rekkefølge, men du kan enkelt sortere i synkende rekkefølge ved å sette reverse
flagget til True
:
i Motsetning til sortering algoritme funksjoner vi skapte, begge disse funksjonene kan sortere lister av tupler og klasser., sorted()
funksjon kan sortere iterable objekt og det inkluderer – lister, strenger, tupler, ordbøker, sett og tilpasset iterators du kan opprette.
Disse sorter funksjoner implementere Tim Sortere algoritme, en algoritme inspirert av Merge Sortere og Innsetting Sorter.
Hastighet Sammenligninger
for Å få et inntrykk av hvor raskt de utfører, vi genererer en liste over 5000 tall mellom 0 og 1000. Vi så hvor lang tid det tar for hver algoritme for å fullføre. Dette er gjentatt 10 ganger slik at vi kan på en mer pålitelig måte å etablere et mønster av ytelse.,
Disse var resultatene, tiden er i sekunder:
vil Du få ulike verdier hvis du setter opp test deg selv, men mønstrene observert bør være den samme eller lignende. Boble-Sortering er den tregeste den verste utøver av alle algoritmer. Mens det er nyttig som en introduksjon til sortering og algoritmer, det er ikke plass for praktisk bruk.
Vi også legge merke til at Rask Sortering er svært rask, nesten dobbelt så fort som Fusjonere Sortere og det ville ikke trenger så mye plass til å kjøre. Husker at våre partisjonen var basert på midten element i listen, ulike partisjoner kan ha forskjellige resultater.,
Som Innsetting Sortere utfører mye mindre sammenligninger enn Utvalget Sortere, implementeringer er vanligvis raskere, men disse går Utvalget Sorter er litt raskere.
Innsetting Sorterer gjør mye mer bytteavtaler enn Utvalget Sorter. Hvis bytte verdier tar opp betydelig mer tid enn å sammenligne verdier, så er dette «i strid» resultatet ville være plausibel.
Vær oppmerksom på omgivelsene når du skal velge sortering algoritmen, så vil det påvirke ytelsen.
Konklusjon
Sorterings-algoritmer gir oss mange måter å bestille våre data., Vi så på 6 forskjellige algoritmer – Boble Sorter Utvalget Sortere, Innsetting Sortere, Fusjonere Sortere, Haugen Sortere, Rask Sorter – og implementeringer i Python.
mengden av sammenligningen og bytteavtaler algoritmen utfører sammen med miljø-kode går er viktige påvirkningsfaktorer for ytelse. I ekte Python-programmer, er det anbefalt at vi stick med den innebygde i Python sortere funksjoner for deres fleksibilitet på input og hastighet.