Tip:
Highlight text to annotate it
X
[Powered by Google Translate] [BUBBLE SORT]
[JACKSON Steinkamp Harvard University]
[Dette er CS50. CS50TV]
Boble Sorter er et eksempel på en sortering algoritme -
det vil si en fremgangsmåte for sortering et sett av elementer i
stigende eller synkende rekkefølge.
For eksempel, hvis du ønsket å sortere en rekke bestående av tallene
[3, 5, 2, 9], ville en korrekt gjennomføring av Bubble Sorter returnere
sorteres array [2, 3, 5, 9] i stigende rekkefølge.
Nå skal jeg forklare i pseudokode hvordan algoritmen fungerer.
>> La oss si at vi sortering en liste over 5 heltall - 3, 2, 9, 6 og 5.
Algoritmen starter ved å se på de første to elementer, 3 og 2,
og sjekke om de er ute av rekkefølge i forhold til hverandre.
De er - 3 er større enn 2.
Å være i stigende rekkefølge, bør de være den andre veien rundt.
Så bytter vi dem.
Nå er listen ser slik ut: [2, 3, 9, 6, 5].
>> Deretter ser vi på andre og tredje element, 3 og 9.
De er i riktig rekkefølge i forhold til hverandre.
Som er, er 3 mindre enn 9 så algoritmen ikke bytte dem.
Deretter ser vi på 9 og 6. De er ute av drift.
>> Så må vi bytte dem fordi 9 er større enn 6.
Til slutt ser vi på de siste to heltall, 9 og 5.
De er ute av drift, slik at de må byttes.
Etter den første komplette pass gjennom listen,
det ser ut som dette: [2, 3, 6, 5, 9].
Ikke dårlig. Det er nesten sortert.
Men vi må kjøre gjennom listen igjen for å få det helt sortert.
To er mindre enn 3, så vi ikke bytte dem.
>> Tre er mindre enn 6, så vi ikke bytte dem.
Seks er større enn 5. Vi byttet.
Seks er mindre enn 9. Vi bytter ikke.
Etter den andre passerer gjennom, ser det slik ut: [2, 3, 5, 6, 9]. Perfekt.
Nå, la oss skrive det i pseudokode.
I utgangspunktet, for hvert element i listen, må vi se på det
og elementet direkte til sin rett.
Hvis de er ute av drift i forhold til hverandre - det vil si hvis elementet på venstre
er større enn den på høyre - vi skal bytte de to elementene.
>> Vi gjør dette for hvert element i listen, og vi har gjort en gjennomgående.
Nå er vi bare nødt til å gjøre Gjennomslaget nok ganger for å sikre listen
er fullt, skikkelig sortert.
Men hvor mange ganger må vi gå gjennom listen for å
garantere at vi er ferdige?
Vel, er det verst tenkelige scenario hvis vi har en helt bakover liste.
Så det tar et antall pass-gjennomføringer lik tallet
elementer n-1.
Hvis dette ikke gir mening intuitivt, tenke på en enkel sak - listen [2, 1].
>> Dette kommer til å ta en pass-through for å sortere riktig.
[3, 2, 1] - Det verste tilfellet er at med 3 elementer sorteres bakover,
det kommer til å ta 2 iterasjoner for å sortere.
Etter en iterasjon, er det [2, 1, 3].
De andre utbytter den sorterte matrisen [1, 2, 3].
Så du vet at du aldri trenger å gå gjennom tabellen, generelt,
mer enn n-1 ganger, der n er antallet elementer i matrisen.
Det kalles Bubble Sorter fordi de største elementene har en tendens til å "boble-up '
til høyre ganske raskt.
Faktisk har denne algoritmen meget interessant atferd.
>> Etter m iterasjoner gjennom hele matrisen,
lengst til høyre m elementene er garantert
skal sorteres i sin riktig sted.
Hvis du ønsker å se dette selv,
Vi kan prøve det på en helt bakover liste [9, 6, 5, 3, 2].
Etter en passering gjennom hele listen,
[Lyden av skriving]
[6, 9, 5, 3, 2], [6, 5, 9, 3, 2], [6, 5, 3, 9, 2], [6, 5, 3, 2, 9]
lengst til høyre element 9 er på sin rette plass.
Etter den andre passering, vil 6 har 'boblet opp' til
andre lengst sted.
De to elementene på høyre - 6 og 9 - vil være i deres riktige steder
etter de første to pass-throughs.
>> Så, hvordan kan vi bruke dette til å optimalisere algoritme?
Vel, etter en iterasjon gjennom matrisen
vi ikke egentlig trenger å sjekke lengst element
fordi vi vet at det sortert.
Etter to iterasjoner, vet vi sikkert den høyre to elementene er på plass.
Så, generelt, etter k iterasjoner gjennom en fullstendig matrise,
sjekke de siste k elementer er overflødig siden vi vet
de er på riktig sted allerede.
>> Så hvis du sortering en rekke n elementer,
på den første iterasjon - du må sortere alle elementene - de første n-0.
På den andre iterasjon, må du se på alle elementene, men den siste -
de første n-1.
En annen optimalisering kan være å sjekke om listen er allerede sortert
etter hver iterasjon.
Hvis det er allerede sortert, trenger vi ikke å gjøre noen flere iterasjoner
gjennom listen.
Hvordan kan vi gjøre dette?
Vel, hvis vi ikke gjør noen bytter på en pass-through av listen,
det er klart at listen var allerede sortert fordi vi ikke bytte noe.
Så vi definitivt ikke trenger å sortere igjen.
>> Kanskje du kunne initialisere et flagg variabel kalt "ikke sortert 'til
falsk og endre den til true hvis du må bytte noen elementer på
en iterasjon gjennom matrisen.
Eller tilsvarende, må en teller til å telle hvor mange swaps du gjør
på en gitt iterasjon.
På slutten av en iterasjon, hvis du ikke bytte noen av elementene,
du vet listen er allerede sortert, og du er ferdig.
Bubble Sorter, som andre sortering algoritmer, kan være
forskjøvet til å jobbe for noen elementer som har en bestilling metode.
>> Som er gitt to elementer du har en måte å si om den første
er større enn, lik eller mindre enn den andre.
For eksempel kan du sortere bokstavene i alfabetet ved å si
at en Bubble Sorter er på ingen måte en svært effektiv eller rask sortering algoritme.
Sitt verste-fall runtime er Big O n ²
fordi du har å gjøre n iterasjoner gjennom en liste
sjekke alle n elementer hver passering, nxn = n ².
Dette driftstid betyr at du som antall elementer du sortere øker,
kjøretiden øker kvadratisk.
>> Men hvis effektivitet er ikke et stort problem for programmet
eller hvis du bare sortere et lite antall elementer,
du kan finne Bubble Sorter nyttig fordi
det er en av de enkleste sortering algoritmer for å forstå
og å kode.
Det er også en fin måte å få erfaring med å oversette en teoretisk
algoritmen i selve fungerende kode.
Vel, det er Bubble Sorter for deg. Takk for å se.
CS50.TV