Quick Tips: Implementere Bubble Sorter i AS3

Quick Tips: Implementere Bubble Sorter i AS3
Del
Del
Del
Del

Denne Cyber ​​Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

I denne hurtig Tip, jeg skal vise deg hvordan og hvorfor de Bubble Sorter algoritmen fungerer, og hvordan du kan gjennomføre den i AS3. Du vil ende opp med en klasse som du kan bruke i alle Flash prosjektet, for sortering noen array.




Endelig resultat Forhåndsvisning

Her er en enkel demo av resultatet av boblen slags algoritme:

Selvfølgelig, dette SWF beviser ikke mye på egen hånd! Grab kildefilene og du kan redigere innspill rekke selv



Trinn 1:. Opprette BubbleSort Class

Som denne algoritmen vil bli brukt mer enn en gang, er det en god idé å lage en klasse for det, slik at vi enkelt kan bruke den i alle AS3 prosjekt:

Sett opp en grunnleggende Flash prosjektet, og inne i prosjektmappen opprette en fil BubbleSort.as
. (Vi vil skape en tester fil her også, så vi kan teste den.)

Hvis du ikke vet hvordan du arbeider med klasser kan du sjekke denne opplæringen. Slik bruker du et dokument klasse i Flash
< p> Vi wont trenger konstruktøren, så bli kvitt det! Klassen din skal se slik ut:


pakken {public class BubbleSort {}}



Trinn 2: hvordan algoritmen Works

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

Dette bildet summerer opp.; på hvert trinn, er hvert par av tall sammenlignet, og starter fra enden, og byttet (ved hjelp av en "spare" temp variabel) hvis de er i feil rekkefølge.

Når alle påfølgende par har blitt sjekket garanterer dette at antallet i starten er det største tallet i sekvensen; vi deretter gjenta, sjekker hvert par av tall bortsett fra tallet i starten
. Når alle påfølgende par har blitt sjekket, vet vi at de første to
tall i sekvensen er i riktig rekkefølge (de er de største og nest største). Vi fortsetter til vi har satt hvert tall i riktig rekkefølge.

Det kalles "boble slags" fordi, på hver passere gjennom rekke, det største antallet "flyter" på toppen av tabellen, som en boble i vann.

Kan starte å skrive koden. Vi kaller den viktigste funksjonen bsort ():


pakken {public class BubbleSort {offentlig funksjon bsort (arr: Array, sortType: String): Array {var temp: String; if (sortType.toLocaleLowerCase () == "synkende") {} else if (sortType.toLocaleLowerCase () == "stigende") {} else kaste nytt Feil ("Du har en skrivefeil når Ringe bsort () -funksjonen, kan bruke "stigende" eller "synkende" for sortType! "); returnere arr; }}}

Funksjonen får to parametere. Den første parameteren, arr, vil matrisen som skal sorteres; den andre paramter, vil sortType brukes til å avgjøre om brukeren ønsker rekken skal sorteres i stigende eller synkende rekkefølge.

I funksjonen erklærer vi en temp variabel som vil holde elementene i matrisen i tilfelle vi trenger å bytte de to elementene. Du lurer kanskje på hvorfor det er ikke et tall. Det er fordi vår klasse vil være i stand til å håndtere String arrays også, 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, bare for å være sikker.

Vi bruker en if-else blokk å dele vår kode i to grener, avhengig av hvilken retning brukeren ønsker å sortere i. (Hvis brukeren ikke gir et gyldig valg, vil programmet avfyre ​​en feil.)

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

La oss skrive algoritmen. Vi starter med den synkende del:


pakken {public class BubbleSort {offentlig funksjon bsort (arr: Array, sortType: String): Array {var temp: String; if (sortType.toLocaleLowerCase () == "synkende") {for (var i: uint = 0; i < arr.length; i ++) {for (var j: uint = arr.length-1; j > jeg; j--) {}}} else if (sortType.toLocaleLowerCase () == "stigende") {} else kaste nytt Feil ("Du har en skrivefeil når Ringe bsort () -funksjonen, kan du bruke" stigende "eller" synkende 'for sortType! "); returnere arr; }}}

Som du ser, bruker vi nestet for løkker. Man går fra det første element til det siste element i matrisen; den andre går bakover.

La oss undersøke den indre "j" loop først. Som tidligere figuren viser, begynner vi ved å sammenligne de to siste elementer i matrisen, som er arr [j-1] og arr [j] (i den første iterasjon). Hvis arr [j-1] er mindre enn arr [j] de må byttes.

I begge tilfeller trekker vi en fra j (gjennom "j--" samtale på linje 131), noe som endrer hvilke par av tallene vil bli sammenlignet på neste løkke.

j starter til en verdi av arr.length-en, og ender med en verdi på 1, noe som betyr at den indre for sløyfekontroll hvert par på rad, med start med den siste paret (der j er lik arr.length-1) og slutter med det første paret.

(der en j lik) Nå la oss se på det ytre "i" loop. Når alle parene har blitt sjekket og byttet som er nødvendig, er jeg økt (gjennom "i ++" samtale på linje 129). Dette betyr at neste gang runde, vil j starter på arr.length-en igjen, men ender på 2 denne gangen - noe som betyr at det første paret i sekvensen ikke vil bli kontrollert eller byttet. Dette er akkurat hva vi vil, siden vi vet at det første tallet er i riktig posisjon.

Som det går på, til slutt vil det være bare to elementer som må sjekkes i indre sløyfe. Når de er ferdig, vet vi at vi har sortert array

Her er hva som ser ut som i kode:
for! (Var i: uint = 0; i < arr.length, jeg ++) { for (var j: uint = arr.length-1; j > i; j--) {if (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 å skape den stigende form!

Vi trenger bare å endre sammenlignings operatør i hvis blokk den indre løkken:
pakken {public class BubbleSort {offentlig funksjon bsort (arr: Array, sortType: String): Array {var temp: String; if (sortType.toLocaleLowerCase () == "synkende") {for (var i: uint = 0; i < arr.length; i ++) {for (var j: uint = arr.length-1; j > i; j--) {if (arr [j-1] < arr [j]) {temp = arr [j-1]; Arr [J-1] = arr [J]; arr [j] = temp; }}}} Else if (sortType.toLocaleLowerCase () == "stigende") {for (var k: uint = 0; k < arr.length; k ++) {for (var l: uint = arr.length-en; l > k; l--) {if (arr [l-1] > arr [l]) {temp = arr [L-1]; Arr [L-1] = arr [L]; arr [l] = temp; }}}} Else {kaste nytt Feil ("Du har en skrivefeil når Ringe bsort () -funksjonen, kan du bruke" stigende "eller" synkende "for sortType!"); } Returnere arr; }}}



Trinn 3: Opprette Tester Application

Opprett en ny Flash-fil, tester.fla
, i samme mappe som BubbleSort.as
. Lag to dynamiske tekstfelt, navne man input_arr
og den andre output_arr
.

Etter å skape utseendet, må vi opprette og knytte dokumentet klassen. Anmeldelser

Lag en fil Tester.as Hotell og knytte dette til tester.fla

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


pakke {import BubbleSort; import flash.display.MovieClip; public class Tester strekker MovieClip {private Var bs: BubbleSort = new 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, "synkende"); output_arr.text = ar.toString (); }}}

I denne linjen, vi kaller den bsort () funksjon av våre variable bs (som er en forekomst av BubbleSort):
ar = bs.bsort (ar, "stigende");

Dette funksjonen returnerer en matrise, slik at vi kan overlate dette som den nye verdien av vår opprinnelige innspill array.

Lagre alt og prøve arbeidet ut.



Konklusjon

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

Hvis du virkelig ønsker å se hvor fort denne algoritmen er i forhold til de andre alternativene (som quicksort), ta en titt på sorting-algorithms.com <. br>