Ing. Jakeline Marcos Abed Algoritmos de Ordenamiento Algoritmos de Ordenamiento Qu son? Son secuencias de instrucciones cuya funcin es acomodar los valores de un arreglo de menor a mayor. Para qu se utilizan? Para poder buscar un valor ms rpidamente. Ejemplo: Directorio Telefnicos Algoritomos Intercambio Bubble Sort Selection Sort Insertion Sort
Merge Sort Quicksort
Heap Sort Shell Sort Eficiencia en tiempo de ejecucin: Una medida de eficiencia es: Contar el # de comparaciones (C) Contar el # de movimientos de items (M)
Estos estn en funcin de el #(n) de items a ser ordenados.
La eficiencia de los algoritmos se mide por el nmero de comparaciones e intercambios que tienen que hacer, es decir, se toma n como el nmero de elementos que tiene el arreglo o vector a ordenar y se dice que un algoritmo realiza O(n 2 ) comparaciones cuando compara n veces los n elementos, n x n = n 2
Intercambio El ms sencillo de todos. Se basa en: la lectura sucesiva de la lista a ordenar, comparando el elemento inferior de la lista con todos los restantes Efectuando el intercambio de posiciones cuando el orden resultante no sea correcto. Siendo n la cantidad de elementos, realizar al menos n1 pasadas. Ejemplo: Ordenacin por Intercambio Pasada 0: Se compara a[0] con todos, as primero se cambia a[0] con a[1] pues a[0] > a[1] y debe ser Ascendente, es decir a[0]<a[1] y por ltimo a[0] con a[3] a[0] a[1] a[2] a[3] 8 4 6 2 a[0] a[1] a[2] a[3] 4 8 6 2 a[0] a[1] a[2] a[3] 2 8 6 4 Pasada 1: El elemento mas pequeo esta en a[0] y se analiza la sublista restante. Al cabo de la pasada, el segundo mas chico esta en a[1]. Pasada i: Al cabo de la pasada i, el elemento de orden i, est en a[i] a[0] a[1] a[2] a[3] 2 4 8 6 Pasada 2: a[0] a[1] a[2] a[3] 2 6 8 4 Ordenacin por Intercambio public void ordIntercambio (int a[]) { int i, j, aux; /* se realizan n-1 pasadas, a[o] ... a[n-2] */ for (i = 0 ; i <= n-2 ; i++)/* coloca mnimo de a[i+1]...a[n-1] en a[i] */ for (j = i+1 ; j <= n-1 ; j++) if (a[i] > a[j]) { aux = a[i]; a[i] = a[j]; a[j]= aux ; } } Complejidad (n1)(n2) Del Orden F(n)=n 2 . Burbuja El mtodo recibe como parmetro un arreglo unidimensional que contiene los elementos a ordenar. El mtodo va comparando cada elemento del arreglo con el que sigue; si el elemento es mayor que el otro, se intercambian. Este proceso dejar el valor ms grande al final del arreglo. Se debe repetir el proceso hasta que no haya ningn intercambio. Burbuja 29 3 8 17 30 15 42 3 29 8 17 30 15 42 3 8 29 17 30 15 42 3 8 17 29 30 15 42 3 8 17 29 30 15 42 3 8 17 29 15 30 42 3 8 17 29 15 30 42 3 8 17 29 15 30 3 8 17 29 15 30 3 8 17 29 15 30 3 8 17 29 15 30 3 8 17 15 29 30 3 8 17 15 29 30 3 8 17 15 29 3 8 17 15 29 3 8 17 15 29 3 8 15 17 29 3 8 15 17 29 3 8 15 17 3 8 15 17 3 8 15 17 3 8 15 17 1 2 3 4 Cantidad de Intercambios: 6 Cantidad de comparaciones: 18 Ejemplo : Ordenacin por Burbuja Pasada 0: a[0] a[1] a[2] a[3] a[4] 50 20 40 80 30 Lista Original Intercambio 50 y 40 a[0] a[1] a[2] a[3] a[4] 20 40 50 80 30 Intercambio 50 y 20 a[0] a[1] a[2] a[3] a[4] 20 50 40 80 30 Intercambio 50 y 80 a[0] a[1] a[2] a[3] a[4] 20 40 50 80 30 Intercambio 80 y 30 a[0] a[1] a[2] a[3] a[4] 20 40 50 30 80 Pasada 1: Ordenados: 20 y 40, 40 y 50. a[0] a[1] a[2] a[3] a[4] 20 40 50 30 80 Intercambio 50 y 30 a[0] a[1] a[2] a[3] a[4] 20 40 30 50 80 Pasada 2: Intercambio 40 y 30 a[0] a[1] a[2] a[3] a[4] 20 30 40 50 80 Lista Ordenada public void burbuja(int a[]) { boolean interruptor = true; for (pasada=0; pasada<n-1 && interruptor; pasada++) { interruptor = false; // no se han hecho intercambios for (j=0; j<n-1-pasada; j++) if (a[j+1] < a[j]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; interruptor = true; } } } } El Mejor Caso: con una lista ya ordenada, har una sola pasada: Del Orden F(n) El Peor Caso: Del Orden F(n 2 ) Seleccin Directa El mtodo recibe como parmetro el arreglo que contiene los elementos a ordenar. Busca en el arreglo el valor ms grande. Intercambia este valor por el que se encuentra en la ltima posicin. Repite el proceso con los valores restantes del arreglo (ya no se incluyen los valores que ya se acomodaron) ==Tambin puede hacerse en sentido contrario, en lugar de buscar el mayor se busca el menor y se coloca en la primera posicin del arreglo. Seleccin 29 3 42 17 30 15 8 29 3 8 17 30 15 42 29 3 8 17 30 15 29 3 8 17 15 30 29 3 8 17 15 15 3 8 17 29 15 3 8 17 15 3 8 8 3 8 3 15 3 8 Comparaciones: 6 + 5 + 4 + 3 + 2 + 1: 21 Intercambios: 5 Busca en el arreglo el valor ms grande. Intercambia este valor por el que se encuentra en la ltima posicin. Ejemplo: Ordenacin por Seleccin Pasada 0: Lista entre 0 y 3. Selecciona el 21 y lo pasa al a[0] a[0] a[1] a[2] a[3] 51 21 39 80 Pasada 1: Lista entre 1 y 3. Selecciona el 39 y lo pasa al a[1] a[0] a[1] a[2] a[3] 21 39 51 80 Pasada 2: Lista entre 2 y 3. No selecciona nada. a[0] a[1] a[2] a[3] 21 39 51 80 a[0] a[1] a[2] a[3] 21 51 39 80 Lista Original Busca en el arreglo el valor ms chico. Intercambia este valor por el que se encuentra en la primera posicin. Codificacin: Ordenamiento por Seleccin public void ordSeleccion (int a[]) { int indiceMenor, i, j; int aux; for (i = 0; i < n-1; i++) // ordenar a[0]..a[n-2] y a[n-1] en cada pasada { indiceMenor = i; // comienzo de la exploracin en ndice i for (j = i+1; j < n; j++) // j explora la sublista a[i+1]..a[n-1] if (a[j] < a[indiceMenor]) indiceMenor = j; if (i != indiceMenor) // sita el elemento mas pequeo en a[i] { aux = a[i]; a[i] = a[indiceMenor]; a[indiceMenor] = aux ; } } } Complejidad (n (n1))/2 Del Orden F(n)=n 2 . No hay caso mejor ni peor Ordenacin Por Insercin Similar al proceso de ordenar tarjetas en un tarjetero por orden alfabtico: Consiste en insertar un elemento en su posicin correcta, dentro de una lista que ya est Ordenada. Algoritmo: El 1er elemento a[0] se lo considera ordenado Se inserta a[1] en la posicin correcta, delante o detrs del a[0], segn sea mayor o menor Por cada ciclo i (desde i=1 hasta n1) se explora la sublista a[0]..a[i1] buscando la posicin correcta de insercin del elemento a[i] Al dejar vaco la posicin a[i] se impone un desplazamiento de todo el vector, desde el lugar de insercin. Insercin El mtodo recibe como parmetro el arreglo que contiene los elementos a ordenar. Compara cada elemento del arreglo con los que se encuentran en las posiciones anteriores. Si resulta que el elemento con el que se est comparando es mayor, se recorre a la derecha Si resulta que el elemento con el que se est comparando es menor, se detiene el proceso debido a que ya se encontr la posicin del elemento. 29 3 42 17 30 15 8 3 29 42 17 30 15 8 3 29 42 17 30 15 8 3 17 29 30 42 15 8 3 29 42 42 30 15 8 3 29 29 42 30 15 8 3 17 29 42 30 15 8 3 17 29 42 42 15 8 3 17 29 30 42 42 8 3 17 29 30 30 42 8 3 17 29 29 30 42 8 3 17 17 29 30 42 8 Insercin 29 29 42 17 30 15 8 Insercin 3 15 17 29 30 42 8 3 15 17 29 30 30 42 3 15 17 29 29 30 42 3 15 17 17 29 30 42 3 15 15 17 29 30 42 3 15 17 29 30 42 42 3 8 15 17 29 30 42 Corrimientos : 18 Comparaciones: 17 Codificacin: Ordenacin por Insercin public void ordInsercion (int [] a) { int i, j, aux; for (i = 1; i < n; i++) // El ndice j explora sublista a[i-1]..a[0] buscando posicin correcta del elemento destino, para asignarlo en a[j] { j = i; aux = a[i]; // se localiza el punto de insercin explorando hacia abajo while (j > 0 && aux < a[j-1]) // desplazar elementos hacia arriba para hacer espacio { a[j] = a[j-1]; j--; } a[j] = aux; } } Complejidad (n (n1))/2 Del Orden F(n)=n 2 . Animacin de los algoritmos Sort de Burbuja (Bubble Sort) Seleccin (Selection Sort) Insercin (Insertion Sort) Merge Sort Quick Sort
http://www.it.uc3m.es/java/ Seccin Animaciones Comparaciones entre Sorts http://www.herongyang.com/sort/index.html Ing. Armandina Leal Flores Ing. Jakeline Marcos Abed Bsquedas Bsqueda Encontrar una CLAVE especfica dentro de un Almacn, donde existe un campo con la clave que se referencia. Si est en la lista, informa su posicin. Si el Almacn est ordenado la bsqueda puede ser ms eficiente. Buscar un nombre-telfono en el directorio telefnico.
Bsqueda Dos Tipos de Bsqueda: Secuencial: Busca la clave explorando un elemento despus de otro. Es la nica forma de encontrarlo cuando la Lista no est Ordenada por la Clave de Bsqueda. Eficiencia del Orden de F(n)=n. Binaria: En listas Ordenadas por la clave de Bsqueda es el mejor mtodo. Se sita la lectura al centro de la lista y se le comprueba contra la clave. Si clave < a[central]: Buscar entre inferior y central1 Si clave > a[central]: Buscar entre central+1 y superior Eficiencia del Orden F(n)=log 2 n Bsqueda Binaria Iterativa public int busquedaBin(int lista[], int clave) { int central, bajo, alto, valorCentral, n; bajo = 0; n = lista.length; alto = n-1; while (bajo <= alto) { central = (bajo + alto)/2; valorCentral = lista[central]; if (clave == valorCentral) return central; else if (clave < valorCentral) alto = central -1; else bajo = central + 1; } return -1; }