In questo suggerimento rapido, ti mostrerò come e perché funziona l'algoritmo Bubble Sort e come implementarlo in AS3. Finirai con una classe che puoi usare in qualsiasi progetto Flash, per ordinare qualsiasi array.
Ecco una semplice demo del risultato dell'algoritmo bubble sort:
Ovviamente, questo SWF non si dimostra molto da solo! Prendi i file sorgente e puoi modificare l'array di input da solo.
Dato che questo algoritmo sarà usato più di una volta, è una buona idea creare una classe per questo, in modo che possiamo facilmente usarlo in qualsiasi progetto AS3:
Configura un progetto Flash di base e all'interno della cartella del progetto crea un file BubbleSort.as. (Creeremo anche qui un file tester, quindi possiamo testarlo.)
Se non sai come lavorare con le classi, consulta questo tutorial: Come utilizzare una classe di documenti in Flash.
Non abbiamo bisogno del costruttore, quindi liberatene! La tua classe dovrebbe assomigliare a questa:
pacchetto public class BubbleSort
Questo algoritmo non è il metodo più veloce o più efficiente per ordinare una serie di numeri, ma è il più semplice da capire.
Questa immagine lo riassume; in ogni fase, ogni coppia di numeri viene confrontata, a partire dalla fine, e scambiata (per mezzo di un "ricambio" Temp
variabile) se sono nell'ordine sbagliato.
Una volta che tutte le coppie consecutive sono state controllate, questo garantisce che il numero all'inizio sia il numero più grande nella sequenza; quindi ripetiamo, controllando ogni coppia di numeri a parte il numero all'inizio. Una volta che tutte le coppie consecutive sono state controllate, sappiamo che il primo Due i numeri nella sequenza sono nell'ordine corretto (sono il più grande e il secondo più grande). Continuiamo finché non abbiamo inserito tutti i numeri nell'ordine corretto.
Si chiama "bubble sort" perché, ad ogni passaggio attraverso l'array, il numero più grande "galleggia" fino alla cima dell'array, come una bolla nell'acqua.
Iniziamo a scrivere il codice. Chiameremo la funzione principale bsort ()
:
package public class BubbleSort public function bsort (arr: Array, sortType: String): Array var temp: String; if (sortType.toLocaleLowerCase () == "descending") else if (sortType.toLocaleLowerCase () == "ascending") else throw new Error ("Hai un errore di battitura quando chiami la funzione bsort (), per favore usa 'ascendente' o 'discendente' per sortType! "); return arr;
La funzione ottiene due parametri. Il primo parametro, arr
, sarà la matrice da ordinare; il secondo paramter, sortType
verrà utilizzato per decidere se l'utente desidera che l'array sia ordinato in ordine crescente o decrescente.
Nella funzione dichiariamo a Temp
variabile che manterrà gli elementi dell'array nel caso in cui avremo bisogno di scambiare i due elementi. Potresti chiederti perché non è un numero. È perché la nostra classe sarà in grado di gestire anche gli array di stringhe, ordinandoli in ordine alfabetico; possiamo convertire i numeri in stringhe e viceversa, ma non possiamo convertire stringhe in numeri e viceversa, quindi usiamo una stringa per questa variabile, solo per sicurezza.
Usiamo un Se
-altro
blocco per dividere il nostro codice in due rami, a seconda della direzione in cui l'utente desidera effettuare l'ordinamento. (Se l'utente non fornisce una scelta valida, il programma genererà un errore).
La differenza tra il codice in entrambi i rami sarà solo un carattere: entrambi <
o >
.
Scriviamo l'algoritmo. Iniziamo con la parte discendente:
package public class BubbleSort public function bsort (arr: Array, sortType: String): Array var temp: String; if (sortType.toLocaleLowerCase () == "descending") per (var i: uint = 0; i < arr.length; i++) for(var j:uint=arr.length-1; j > io; j--) else if (sortType.toLocaleLowerCase () == "ascending") else lancia un nuovo errore ("Hai un refuso quando chiami la funzione bsort (), per favore usa 'ascendente' o 'discendente 'per sortType! "); return arr;
Come puoi vedere, stiamo usando nidificato per
loop. Uno va dal primo elemento all'ultimo elemento dell'array; l'altro va indietro.
Ispezioniamo l'interno "j
come prima mostra il diagramma, iniziamo confrontando gli ultimi due elementi dell'array, che sono arr [j-1]
e arr [j]
(nella prima iterazione). Se arr [j-1]
è meno di arr [j]
hanno bisogno di essere scambiati.
In entrambi i casi ne sottraiamo uno da j
(tramite la "j--
msgstr "chiama nella riga 131), che cambia quale coppia di numeri verrà confrontata nel ciclo successivo.
j
inizia a un valore di arr.Length-1
, e finisce con un valore di 1
, significa che l'interno per
loop controlla ogni coppia consecutiva, iniziando dall'ultima coppia (dove j
è uguale a arr.Length-1
) e termina con la prima coppia (dove j
è uguale a 1
).
Adesso guardiamo l'esterno "io
"loop. Una volta che tutte le coppie sono state controllate e scambiate se necessario, io
è aumentato (attraverso il "io++
msgstr "chiama nella riga 129) Ciò significa che, la prossima volta, j
inizierà a arr.Length-1
di nuovo, ma alla fine 2
questa volta - il che significa che la prima coppia nella sequenza non verrà controllata o scambiata. Questo è esattamente ciò che vogliamo, poiché sappiamo che il primo numero è nella posizione corretta.
Mentre continua, alla fine ci saranno solo due elementi che devono essere controllati nel ciclo interno. Una volta terminato, sappiamo che abbiamo ordinato la matrice!
Ecco come appare nel codice:
per (var i: uint = 0; iio; j--) if (arr [j-1] < arr[j]) temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp;
E l'algoritmo è pronto!
Ora possiamo usare la stessa logica per creare l'ordinamento crescente:
Dobbiamo solo cambiare l'operatore di confronto nel blocco if del ciclo interno:
package public class BubbleSort public function bsort (arr: Array, sortType: String): Array var temp: String; if (sortType.toLocaleLowerCase () == "descending") for (var i: uint = 0; iio; j--) if (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--) if (arr [l-1]> arr [l]) temp = arr [l-1]; arr [l-1] = arr [l]; arr [l] = temp; else lancia un nuovo errore ("Hai un errore quando chiami la funzione bsort (), per favore usa 'ascendente' o 'discendente' per sortType!"); return arr;
Crea un nuovo file flash, tester.fla, nella stessa cartella di BubbleSort.as. Creare due campi di testo dinamici, nominarne uno input_arr e l'altro output_arr.
Dopo aver creato l'aspetto, dobbiamo creare e collegare la classe del documento.
Crea un file Tester.as e collegalo a tester.fla
Ora possiamo finalmente usare la nostra classe nel Tester.as:
pacchetto importazione BubbleSort; import flash.display.MovieClip; public class Tester estende MovieClip private var bs: BubbleSort = new BubbleSort (); funzione pubblica 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 ();
In questa linea, chiamiamo il bsort ()
funzione della nostra variabile bs
(che è un'istanza di BubbleSort
):
ar = bs.bsort (ar, "ascendente");
Questa funzione restituisce un array, quindi possiamo assegnarlo come nuovo valore del nostro array di input originale.
Salva tutto e prova il tuo lavoro.
In questo tutorial abbiamo creato una funzione per aiutarci ad ordinare una matrice. Potremmo migliorare l'efficienza; per ulteriori informazioni, puoi leggere Wikipedia - Bubble Sort
Se vuoi davvero vedere quanto velocemente questo algoritmo viene confrontato con le altre opzioni (come quicksort), dai un'occhiata a sorting-algorithms.com.