Tip:
Highlight text to annotate it
X
[Powered by Google Translate] [BUBBLE SORT]
[JACKSON Steinkamp Harvard University]
[Dette er CS50. CS50TV]
Bubble Sorter er et eksempel på en sorteringsalgoritme -
det vil sige en fremgangsmåde til sortering af et sæt af elementer i
stigende eller faldende rækkefølge.
For eksempel består hvis du ønsker at sortere et array af de numre
[3, 5, 2, 9], ville en korrekt gennemførelse af Bubble Sorter returnere
sorteret array [2, 3, 5, 9] i stigende orden.
Nu vil jeg forklare i pseudokode hvordan algoritmen virker.
>> Lad os sige, at vi sorterer en liste over 5 heltal - 3, 2, 9, 6 og 5.
Den algoritme starter ved at kigge på de to første elementer, 3 og 2,
og kontrol, hvis de er ude af drift i forhold til hinanden.
De er - 3 er større end 2.
At være i stigende rækkefølge, bør de være den anden vej rundt.
Så vi bytte dem.
Nu listen ser sådan ud: [2, 3, 9, 6, 5].
>> Dernæst ser vi på det andet og tredje elementer, 3 og 9.
De er i den rigtige rækkefølge i forhold til hinanden.
Det vil sige, 3 er mindre end 9, således at algoritmen ikke bytte dem.
Dernæst ser vi på 9 og 6. De er ude af drift.
>> Så vi er nødt til at bytte dem, fordi 9 er større end 6.
Endelig ser vi på de sidste to heltal, 9 og 5.
De er ude af drift, så de skal byttes.
Efter den første komplette passage gennem listen,
det ser sådan ud: [2, 3, 6, 5, 9].
Ikke dårligt. Det er næsten sorteret.
Men vi er nødt til at køre gennem listen igen for at få det helt sorteres.
To er mindre end 3, så vi ikke bytte dem.
>> Tre er mindre end 6, så vi ikke bytte dem.
Seks er større end 5. Vi byttes.
Seks er mindre end 9. Vi har ikke byttes.
Efter den anden passage igennem, ser det sådan her ud: [2, 3, 5, 6, 9]. Perfekt.
Nu, lad os skrive det i pseudokode.
Dybest set, for hvert element i listen, er vi nødt til at se på det
og elementet direkte til sin ret.
Hvis de er ude af funktion i forhold til hinanden - det vil sige, hvis elementet til venstre
er større end en på højre - vi skulle bytte de to elementer.
>> Vi gør dette for hvert enkelt element på listen, og vi har lavet en passage igennem.
Nu skal vi bare nødt til at gøre gennemslaget nok gange til at sikre listen
er fuldt, korrekt sorteret.
Men hvor mange gange skal vi nødt til at passere gennem listen til
garantere, at vi er færdige?
Nå, det værst tænkelige scenarie er, hvis vi har en helt bagud liste.
Så det tager en række gennemløb svarende til det antal
elementer n-1.
Hvis dette ikke giver mening intuitivt, så tænk på en simpel sag - listen [2, 1].
>> Dette kommer til at tage en pass-through for at sortere korrekt.
[3, 2, 1] - Det værste tilfælde er, at med 3 elementer sorteres baglæns,
det vil tage 2 iterationer at sortere.
Efter én iteration, er det [2, 1, 3].
Det andet giver den sorterede array [1, 2, 3].
Så du ved, at du aldrig behøver at gå gennem array, i almindelighed,
mere end n-1 gange, hvor n er antallet af elementer i arrayet.
Det hedder Bubble Sorter fordi de største elementer tendens til at boble-up '
til højre temmelig hurtigt.
Faktisk har denne algoritme meget interessant adfærd.
>> Efter m iterationer gennem hele systemet,
yderst til højre m elementer er garanteret
skal sorteres i deres korrekte sted.
Hvis du ønsker at se det for dig selv,
vi kan prøve det på en helt baglæns liste [9, 6, 5, 3, 2].
Efter en passage gennem hele listen,
[Lyden af skrivning]
[6, 9, 5, 3, 2], [6, 5, 9, 3, 2], [6, 5, 3, 9, 2], [6, 5, 3, 2, 9]
længst til højre element 9 er på sin rette plads.
Efter den anden pass-through, vil de 6 har 'boblede op' til
sekund længst sted.
De to elementer til højre - 6 og 9 - vil være i deres rette steder
efter de første to gennemløb.
>> Så hvordan kan vi bruge dette til at optimere algoritmen?
Nå, efter en iteration gennem opstillingen
vi egentlig ikke brug for at kontrollere den længst til højre element
fordi vi ved, det er sorteret.
Efter to iterationer, ved vi med sikkerhed, yderst til højre to elementer er på plads.
Så i almindelighed, efter k iterationer gennem hele arrayet
Kontrol af det sidste k elementer er overflødigt, da vi ved,
de er på den korrekte placering allerede.
>> Så hvis du sorterer et array af n elementer,
på den første iteration - du behøver at sortere alle elementerne - den første n-0.
På den anden iteration, er du nødt til at se på alle de elementer, men den sidste -
den første n-1.
En anden optimering kunne være at kontrollere, om listen allerede er sorteret
efter hver iteration.
Hvis den allerede er sorteret, behøver vi ikke at gøre nogen flere iterationer
gennem listen.
Hvordan kan vi gøre det?
Tja, hvis vi ikke gør nogen swaps på en pass-through af listen,
Det er klart, at listen allerede blev sorteret, fordi vi ikke bytte noget.
Så vi absolut ikke behøver at sortere igen.
>> Måske kunne du initialisere et flag variabel kaldet »ikke sorteret" til
false og ændre det til sand, hvis du er nødt til at skifte nogen elementer på
en iteration gennem opstillingen.
Eller ligeledes gøre en tæller til at tælle, hvor mange swaps du foretager
på en given iteration.
Ved afslutningen af en iteration, hvis du ikke skifte nogle af de elementer
du kender listen er allerede sorteret og du er færdig.
Bubble Sorter, ligesom andre sortering algoritmer, kan være
sammenknebne at arbejde for de elementer, der har en bestilling metode.
>> Det er på grund af to elementer du har en måde at sige, om den første
er større end, lig med eller mindre end den anden.
For eksempel kan du sortere bogstaver i alfabetet ved at sige
at a Bubble Sorter er på ingen måde en meget effektiv eller hurtig sortering algoritme.
Dens worst case runtime er Big O n ²
fordi du er nødt til at gøre n iterationer gennem en liste
kontrollere alle n elementer hver pass-through, nxn = n ².
Det kører tid betyder, at antallet af elementer, du sorterer stiger,
køretiden stiger kvadratisk.
>> Men hvis effektivitet ikke er et stort problem på dit program
eller hvis du kun sortere et lille antal elementer,
du måske kan finde Bubble Sorter nyttigt, fordi
det er en af de enkleste sortering algoritmer til at forstå
og at kode.
Det er også en god måde at få erfaring med at oversætte en teoretisk
algoritme til egentlig fungerende kode.
Tja, det er Bubble Sorter for dig. Tak for at se.
CS50.TV