[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