Rask Tips Implementere Bubblesortet i AS3

I denne Quick Tip, vil jeg vise deg hvordan og hvorfor Bubble Sort-algoritmen fungerer, og hvordan du implementerer den i AS3. Du vil ende opp med en klasse som du kan bruke i et hvilket som helst Flash-prosjekt, for å sortere hvilken som helst matrise.


Endelig resultatforhåndsvisning

Her er en enkel demo av resultatet av boble sorteringsalgoritmen:

Selvfølgelig viser denne SWF ikke mye på egen hånd! Ta tak i kildefilene, og du kan selv redigere innmatingsarrangementet.


Trinn 1: Opprette BubbleSort-klassen

Siden denne algoritmen vil bli brukt mer enn en gang, er det en god ide å lage en klasse for det, slik at vi enkelt kan bruke det i ethvert AS3-prosjekt:

Sett opp et grunnleggende Flash-prosjekt, og opprett en fil i prosjektmappen BubbleSort.as. (Vi lager også en testerfil her, så vi kan teste det.)

Hvis du ikke vet hvordan du skal jobbe med klasser, vennligst sjekk denne veiledningen: Slik bruker du en dokumentklasse i Flash.

Vi trenger ikke konstruktøren, så bli kvitt det! Din klasse skal se slik ut:

 pakke offentlig klasse BubbleSort 

Trinn 2: Hvordan Algoritmen Fungerer

Denne algoritmen er ikke den raskeste eller mest effektive metoden for å sortere en rekke tall, men det er den enkleste å forstå.

Dette bildet oppsummerer det i hvert trinn sammenlignes hvert par tall, begynner fra slutten, og byttes (ved hjelp av en "reserve" temp variabel) hvis de er i feil rekkefølge.

Når alle sammenhengende par er blitt sjekket, garanterer dette at nummeret ved starten er det største nummeret i sekvensen; Vi gjentar deretter, kontrollerer hvert par tall bortsett fra nummeret i starten. Når alle sammenhengende par er blitt sjekket, vet vi at den første to tall i sekvensen er i riktig rekkefølge (de er de største og nest største). Vi fortsetter å gå til vi har satt alle tallene i riktig rekkefølge.

Det kalles "bubblesort" fordi på hver passering gjennom arrayet er det største nummeret "flyter" til toppen av matrisen, som en boble i vann.

La oss begynne å skrive koden. Vi kaller hovedfunksjonen bsort ():

 pakke offentlig klasse BubbleSort offentlig funksjon bsort (arr: Array, sortType: String): Array var temp: String; hvis (sortType.toLocaleLowerCase () == "descending")  annet hvis (sortType.toLocaleLowerCase () == "stigende")  annet kaster ny feil ("Du har en skrivefeil når du ringer til bsort () -funksjonen, vær så snill bruk 'stigende' eller 'synkende' for sortType! "); tilbake ar; 

Funksjonen får to parametere. Den første parameteren, arr, vil være arrayet som skal sorteres; den andre parameteren, sortType vil bli brukt til å bestemme om brukeren vil at arrayet skal sorteres i stigende eller synkende rekkefølge.

I funksjonen erklærer vi en temp variabel som vil holde elementene i arrayet hvis vi trenger å bytte de to elementene. Du lurer kanskje på hvorfor det ikke er et tall. Det er fordi vår klasse vil kunne håndtere String-arrayer, sortere dem alfabetisk; vi kan konvertere tall til strenger og tilbake igjen, men vi kan ikke konvertere strenger til tall og tilbake igjen, så vi bruker en streng for denne variabelen, for å være trygg.

Vi bruker en hvis-ellers blokkere for å dele koden vår i to grener, avhengig av hvilken retning brukeren vil sortere inn. (Hvis brukeren ikke gir et gyldig valg, vil programmet brenne en feil.)

Forskjellen mellom koden i hver gren vil bare være ett tegn: heller < eller >.

La oss skrive algoritmen. Vi starter med den nedstigende delen:

 pakke offentlig klasse BubbleSort offentlig funksjon bsort (arr: Array, sortType: String): Array var temp: String; hvis (sortType.toLocaleLowerCase () == "descending") for (var jeg: uint = 0; i < arr.length; i++)  for(var j:uint=arr.length-1; j > Jeg; j))  annet hvis (sortType.toLocaleLowerCase () == "stigende")  Endre kaste ny feil ("Du har en skrivefeil når du ringer til bsort () -funksjonen, bruk" stigende "eller" synkende 'for sortType! "); tilbake ar; 

Som du ser, bruker vi nestet til sløyfer. Man går fra det første elementet til det siste elementet i arrayet; den andre går bakover.

La oss inspisere den indre "j"loop først. Som det tidligere diagrammet viser, begynner vi ved å sammenligne de to siste elementene i arrayet, som er arr [j-1] og arr [j] (i den første iterasjonen). Hvis arr [j-1] er mindre enn arr [j] de må byttes.

I begge tilfeller trekker vi en fra j (gjennom "j--"ring i linje 131), som endrer hvilket par tall som skal sammenlignes på neste sløyfe.

j starter til en verdi av arr.length-1, og slutter med en verdi på 1, som betyr at det indre til loop kontrollerer hvert sammenhengende par, starter med det siste paret (hvor j er lik arr.length-1) og slutter med det første paret (hvor j er lik 1).

La oss nå se på den ytre "Jeg"loop. Når alle parene er blitt sjekket og byttet etter behov, Jeg er økt (gjennom "Jeg++"ring i linje 129). Dette betyr at neste gang rundt, j vil starte på arr.length-1 igjen, men slutt på 2 denne gangen - noe som betyr at det første paret i sekvensen ikke blir sjekket eller byttet ut. Dette er akkurat det vi ønsker, siden vi vet at det første nummeret er i riktig posisjon.

Som det skjer, vil det til slutt bare være to elementer som må kontrolleres i indre sløyfe. Når de er ferdige, vet vi at vi har sortert arrayen!

Her ser det ut som i kode:

 for (var jeg: uint = 0; i Jeg; j--) hvis (arr [j-1] < arr[j])  temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp;   

Og algoritmen er klar!

Nå kan vi bruke samme logikk for å lage den stigende typen:

Vi trenger bare å endre sammenligningsoperatøren i if-blokken av indre sløyfe:

 pakke offentlig klasse BubbleSort offentlig funksjon bsort (arr: Array, sortType: String): Array var temp: String; hvis (sortType.toLocaleLowerCase () == "descending") for (var jeg: uint = 0; i Jeg; j--) hvis (arr [j-1] < arr[j])  temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp;     else if(sortType.toLocaleLowerCase() == "ascending")  for(var k:uint=0; k k; l--) hvis (arr [l-1]> arr [l]) temp = arr [l-1]; arr [l-1] = arr [l]; arr [l] = temp;  ellers kaste ny feil ("Du har en skrivefeil når du ringer til bsort () -funksjonen, bruk" stigende "eller" synkende "for sortType!");  tilbake ar; 

Trinn 3: Opprette testerapplikasjonen

Lag en ny flashfil, tester.fla, i samme mappe som BubbleSort.as. Opprett to dynamiske tekstfelter, navn ett input_arr og den andre output_arr.

Etter å ha skapt utseendet, må vi opprette og knytte dokumentet klassen.

Lag en fil Tester.as og lenke dette til tester.fla

Nå kan vi endelig bruke vår klasse i Tester.as:

 pakke importere BubbleSort; importer flash.display.MovieClip; Public Class Tester utvider MovieClip private var bs: BubbleSort = ny BubbleSort (); offentlig funksjon Tester () var ar: Array = [5,7,9,8,1,3,6,2,4,5,0]; input_arr.text = ar.toString (); ar = bs.bsort (ar, "descending"); output_arr.text = ar.toString (); 

I denne linjen kaller vi bsort () funksjon av vår variabel bs (som er en forekomst av boblesortering):

ar = bs.bsort (ar, "stigende");

Denne funksjonen returnerer en matrise, slik at vi kan tilordne dette som den nye verdien av vår originale inngangsgruppe.

Lagre alt og prøv arbeidet ditt.


Konklusjon

I denne opplæringen opprettet vi en funksjon for å hjelpe oss med å sortere et Array. Vi kunne forbedre effektiviteten; For mer om det, kan du lese Wikipedia - Bubble Sort

Hvis du virkelig ønsker å se hvor raskt denne algoritmen sammenlignes med de andre alternativene (som quicksort), ta en titt på sorting-algorithms.com.