Estructura de Datos Mg. Jos Luis Cerrn Prez Ordenamiento y Bsqueda
Mg. Jos Luis Cerrn Prez Objetivos Con el estudio de este captulo usted podr: Conocer los algoritmos basados en el intercambio de elementos. Conocer el algoritmo de ordenacin por insercin. Conocer el algoritmo de burbuja. Conocer el algoritmo de Shell. Aplicar mtodos mas eficientes de ordenacin de arrays. Diferenciar entre bsqueda secuencial y bsqueda binaria. ORDENACIN La ordenacin o clasificacin de datos (sort, en ingls) es una operacin consistente en disponer un conjunto de datos en algn determinado orden con respecto a uno de los campos de los elementos del conjunto. Una lista est ordenada por la clave k si la lista est en orden ascendente o descendente con respecto a esa clave. La lista est en orden ascendente si: i < j implica que k[i] <= k[j] y est en orden descendente si: i > j implica que k[i] <= k[j] ORDENACIN Los mtodos de ordenacin se suelen dividir en dos grandes grupos: Directos: burbuja, seleccin, insercin Indirectos (avanzados) shell, ordenacin rpida, ordenacin por mezcla, radixsort
ALGORITMOS DE ORDENACIN BSICOS Los algoritmos bsicos de ordenacin ms simples y clsicos son: Ordenacin por seleccin. Ordenacin por insercin. Ordenacin por burbuja. ORDENACIN POR INTERCAMBIO El algoritmo de ordenacin tal vez ms sencillo sea el denominado de intercambio, que ordena los elementos de una lista en orden ascendente. El algoritmo se basa en la lectura sucesiva de la lista a ordenar, comparando el elemento inferior de la lista con los restantes y efectuando un intercambio de posiciones cuando el orden resultante de la comparacin no sea el correcto. ORDENACIN POR INTERCAMBIO Pasada 1 ORDENACIN POR INTERCAMBIO Pasada 2
Pasada 3
ORDENACIN POR INTERCAMBIO El intercambio (swap) de los elementos a[i],a[j] se realiza en el mtodo intercambiar(): public static void intercambiar(int []a, int i, int j) { int aux = a[i]; a[i] = a[j]; a[j]= aux ; }
ORDENACIN POR INTERCAMBIO public static void ordIntercambio (int a[]) { int i, j; for (i = 0 ; i < a.length-1; i++){ for (j = i+1 ; j < a.length; j++){ if (a[i] > a[j]) { intercambiar(a, i, j); } } } } ORDENACIN POR SELECCIN El algoritmo se apoya en las pasadas que intercambian el elemento ms pequeo, sucesivamente con el elemento de la lista, a[], que ocupa la posicin igual al orden de pasada (hay que considerar el ndice 0). La pasada inicial busca el elemento ms pequeo de la lista y se intercambia con a[0], primer elemento de la lista. Despus de terminar esta primera pasada, el frente de la lista est ordenado y el resto de la lista a[1], a[2]...a[n-1] permanece desordenado. La siguiente pasada busca en esta lista desordenada y selecciona el elemento ms pequeo, que se almacena entonces en la posicin a[1], y as sucesivamente hasta el ultimo elemento. ORDENACIN POR SELECCIN ORDENACIN POR SELECCIN public static void ordSeleccion (double a[]) { int indiceMenor, i, j, n; n = a.length; for (i = 0; i < n-1; i++) { // comienzo de la exploracin en ndice i indiceMenor = i; // j explora la sublista a[i+1]..a[n-1] for (j = i+1; j < n; j++){ if (a[ j ] < a[indiceMenor]){ indiceMenor = j; } } // sita el elemento mas pequeo en a[i] if (i != indiceMenor){ intercambiar(a, i, indiceMenor); } } } ORDENACIN POR INSERCIN El mtodo de ordenacin por insercin es similar al proceso tpico de ordenar tarjetas de nombres (cartas de una baraja) por orden alfabtico consistente en insertar un nombre en su posicin correcta dentro de una lista que ya est ordenada. El proceso en el caso de la lista de enteros es: ORDENACIN POR INSERCIN El mtodo de ordenacin por insercin es similar al proceso tpico de ordenar tarjetas de nombres (cartas de una baraja) por orden alfabtico consistente en insertar un nombre en su posicin correcta dentro de una lista que ya est ordenada. El proceso en el caso de la lista de enteros es: ORDENACIN POR INSERCIN El algoritmo correspondiente a la ordenacin por insercin contempla los siguientes pasos: 1. El primer elemento a[0] se considera ordenado; es decir, la lista inicial consta de un elemento. 2. Se inserta a[1] en la posicin correcta; delante o detrs de a[0], dependiendo de si es menor o may 3. Por cada bucle o iteracin i (desde i=1 hasta n-1) se explora la sublista a[i-1] ... a[0] buscando la posicin correcta de insercin de a[i]; a la vez, se mueven hacia abajo (a la derecha en la sublista) una posicin todos los elementos mayores que el elemento a insertar a[i], para dejar vaca esa posicin. 4. Insertar el elemento a[i] a la posicin correcta. ORDENACIN POR INSERCIN public static void ordInsercion (int [] a) { int i, j; int aux; for (i = 1; i < a.length; i++) { /* indice j es para explorar la sublista a[i-1]..a[0] buscando la posicion correcta del elemento destino*/ 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; } } ORDENACIN POR INSERCIN public static void ordInsercion (int [] a) { int i, j; int aux; for (i = 1; i < a.length; i++) { /* indice j es para explorar la sublista a[i-1]..a[0] buscando la posicion correcta del elemento destino*/ 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; } } Resumen Una de las aplicaciones ms frecuentes, en programacin es la ordenacin. Existen dos tcnicas de ordenacin fundamentales en gestin de datos: ordenacin de listas y ordenacin de archivos. Los datos se pueden ordenar en orden ascendente o en orden descendente. Cada recorrido de los datos durante el proceso de ordenacin se conoce como pasada o iteracin. Bibliografa