En este Consejo rápido, te mostraré cómo y por qué funciona el algoritmo de clasificación de burbujas, y cómo implementarlo en AS3. Terminará con una clase que puede usar en cualquier proyecto de Flash, para ordenar cualquier matriz.
Aquí hay una simple demostración del resultado del algoritmo de clasificación de burbujas:
Por supuesto, este SWF no prueba mucho por sí mismo! Coge los archivos de origen y puedes editar la matriz de entrada tú mismo.
Como este algoritmo se utilizará más de una vez, es una buena idea crear una clase para él, de modo que podamos usarlo fácilmente en cualquier proyecto de AS3:
Configure un proyecto Flash básico y, dentro de la carpeta del proyecto, cree un archivo. BubbleSort.as. (También crearemos un archivo de prueba aquí, para que podamos probarlo).
Si no sabe cómo trabajar con clases, consulte este tutorial: Cómo usar una clase de documento en Flash.
No necesitamos el constructor, ¡así que deshazte de él! Tu clase debería verse así:
paquete clase pública BubbleSort
Este algoritmo no es el método más rápido o eficiente para clasificar una serie de números, pero es el más fácil de entender..
Esta imagen lo resume; En cada etapa, cada par de números se comparan, comenzando desde el final, y se intercambian (por medio de un "repuesto" temperatura
variable) si están en el orden incorrecto.
Una vez que se hayan verificado todos los pares consecutivos, esto garantiza que el número al comienzo es el número más grande en la secuencia; Luego repetimos, comprobando cada par de números. aparte del numero al inicio. Una vez que todos los pares consecutivos han sido verificados, sabemos que el primer dos los números en la secuencia están en el orden correcto (son el más grande y el segundo más grande). Seguimos hasta que hayamos puesto todos los números en el orden correcto..
Se llama el "tipo de burbuja" porque, en cada paso a través de la matriz, el número más grande "flota" a la parte superior de la matriz, como una burbuja en el agua.
Vamos a empezar a escribir el código. Llamaremos a la función principal. bsort ()
:
package public class BubbleSort public function bsort (arr: Array, sortType: String): Array var temp: String; if (sortType.toLocaleLowerCase () == "descendente") else if (sortType.toLocaleLowerCase () == "ascendente") else lanza un nuevo error ("Tiene un error tipográfico al llamar a la función bsort (), por favor use 'ascendente' o 'descendente' para sortType! "); volver arr;
La función obtiene dos parámetros. El primer parametro, arr
, será la matriz a ordenar; el segundo parametro, sortType
se utilizará para decidir si el usuario desea que la matriz se clasifique en orden ascendente o descendente.
En la función declaramos un temperatura
variable que mantendrá los elementos de la matriz en caso de que necesitemos intercambiar los dos elementos. Usted puede preguntarse por qué no es un número. Es porque nuestra clase también podrá manejar matrices de cadenas, clasificándolas alfabéticamente; podemos convertir números a cadenas y viceversa, pero no podemos convertir cadenas a números y viceversa, así que usamos una Cadena para esta variable, solo para estar seguros.
Usamos un Si
-más
bloque para dividir nuestro código en dos ramas, dependiendo de la dirección que el usuario quiera ordenar. (Si el usuario no proporciona una opción válida, el programa generará un error).
La diferencia entre el código en cualquiera de las ramas será solo un carácter: <
o >
.
Vamos a escribir el algoritmo. Comenzamos con la parte descendente:
package public class BubbleSort public function bsort (arr: Array, sortType: String): Array var temp: String; if (sortType.toLocaleLowerCase () == "descendente") para (var i: uint = 0; i < arr.length; i++) for(var j:uint=arr.length-1; j > yo; j--) else if (sortType.toLocaleLowerCase () == "ascendente") else lanza un nuevo error ("Tiene un error tipográfico al llamar a la función bsort (), use 'ascendente' o 'descendente 'para sortType! "); volver arr;
Como puedes ver, estamos usando anidados para
bucles Uno va desde el primer elemento hasta el último elemento de la matriz; el otro va hacia atrás.
Vamos a inspeccionar el interior "j
"primero el bucle. Como muestra el diagrama anterior, comenzamos comparando los dos últimos elementos de la matriz, que son arr [j-1]
y arr [j]
(en la primera iteración). Si arr [j-1]
es menos que arr [j]
necesitan ser intercambiados.
En cualquier caso restamos uno de j
(a través de "j--
"llamada en la línea 131), que cambia qué par de números se compararán en el siguiente bucle.
j
comienza en un valor de arr.length-1
, y termina con un valor de 1
, lo que significa que el interior para
el bucle verifica cada par consecutivo, comenzando con el último par (donde j
es igual a arr.length-1
) y terminando con el primer par (donde j
es igual a 1
).
Ahora veamos el exterior "yo
"loop. Una vez que todas las parejas se han verificado y cambiado según sea necesario, yo
se incrementa (a través del "yo++
"llame a la línea 129). Esto significa que, la próxima vez, j
comenzará en arr.length-1
de nuevo, pero termina en 2
esta vez - lo que significa que el primer par en la secuencia no será revisado o intercambiado. Esto es exactamente lo que queremos, ya que sabemos que el primer número está en la posición correcta.
A medida que avanza, al final solo habrá dos elementos que deben verificarse en el bucle interno. Una vez que terminan, sabemos que hemos ordenado la matriz!
Esto es lo que parece en código:
para (var i: uint = 0; iyo; j--) si (arr [j-1] < arr[j]) temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp;
Y el algoritmo está listo.!
Ahora podemos usar la misma lógica para crear el ordenamiento ascendente:
Solo necesitamos cambiar el operador de comparación en el bloque if del bucle interno:
package public class BubbleSort public function bsort (arr: Array, sortType: String): Array var temp: String; if (sortType.toLocaleLowerCase () == "descendente") para (var i: uint = 0; iyo; j--) si (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 else Error nuevo ("¡Tiene un error tipográfico al llamar a la función bsort (), use 'ascendente' o 'descendente' para sortType!"); volver arr;
Crear un nuevo archivo flash, tester.fla, en la misma carpeta que BubbleSort.as. Cree dos campos de texto dinámicos, nombre uno input_arr y el otro output_arr.
Después de crear la apariencia, debemos crear y vincular la clase de documento..
Crear un archivo Tester.as y vincular esto a tester.fla
Ahora podemos finalmente usar nuestra clase en el Tester.as:
paquete importar BubbleSort; importar flash.display.MovieClip; Tester de clase pública extiende MovieClip private var bs: BubbleSort = new BubbleSort (); Función pública Tester () var ar: Array = [5,7,9,8,1,3,6,2,4,5,0]; input_arr.text = ar.toString (); ar = bs.bsort (ar, "descendente"); output_arr.text = ar.toString ();
En esta línea, llamamos al bsort ()
función de nuestra variable bs
(que es una instancia de Ordenamiento de burbuja
):
ar = bs.bsort (ar, "ascendente");
Esta función devuelve una matriz, por lo que podemos asignarla como el nuevo valor de nuestra matriz de entrada original.
Guarda todo y prueba tu ejercicio..
En este tutorial creamos una función para ayudarnos a ordenar una matriz. Podríamos mejorar la eficiencia; Para más información, puedes leer Wikipedia - Bubble Sort
Si realmente desea ver qué tan rápido se compara este algoritmo con las otras opciones (como quicksort), eche un vistazo a sorting-algorithms.com.