1 Ordenación y Búsqueda
2 Ordenación La ordenación de los datos consiste en disponer un conjunto de datos (o una estructura) en algún determinado orden con respecto a alguno de sus campos. Orden: Relación de una cosa con otra. Clave: Campo por el cual se ordena. Según donde estén almacenados los datos a Ordenar, podemos decir que la Ordenación es: Interna: Arrays, listas o árbol. Externa: En Archivos en discos o cintas.
3 Orden Una lista de datos está ordenada por la clave k si la lista está en orden con respecto a la clave anterior. Este Orden puede ser: Ascendente: (i
4 Clasificación de Métodos de OrdenaciónTodos los métodos se verán con Orden Ascendente. Analizaremos los siguientes métodos: Básicos: Son eficaces en Listas pequeñas Burbuja e Intercambio: simple pero Ineficiente. Selección e inserción: Recomendados. Avanzados: Son eficaces en Listas grandes. Shell: muy extendido.
5 Ordenación Por IntercambioEl más 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 n–1 pasadas.
6 Ejemplo Ordenación por IntercambioPasada 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[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 pequeño esta en a[0] y se analiza la sublista restante. Al cabo de la pasada, el segundo mas chico esta en a[1]…. a[0] a[1] a[2] a[3] 2 6 8 4 a[0] a[1] a[2] a[3] 2 4 8 6 Pasada 2: a[0] a[1] a[2] a[3] 2 4 6 8 Pasada i: Al cabo de la pasada i, el elemento de orden i, está en a[i]
7 Codificación C: Ordenación por Intercambiovoid ordIntercambio (int a[], int n) { int i, j, aux; /* se realizan n-1 pasadas, a[o] ... a[n-2] */ for (i = 0 ; i <= n-2 ; i++)/* coloca mínimo 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 (n–1)(n–2) Del Orden F(n)=n2.
8 Ordenación Por SelecciónRealiza sucesivas pasadas que Busca el elemento más pequeño de la lista a y lo escribe al frente de la lista a[0]. Considera las posiciones restantes, a[1]…a[n] Finaliza cuando ya no hay Posiciones Restantes. En la pasada i Está Ordenado: desde a[0] hasta a[i–1]. Está Desordenado: Desde a[i] hasta a[n]. El proceso continua n–1 vueltas.
9 Ejemplo Ordenación por SelecciónLista Original a[0] a[1] a[2] a[3] 51 21 90 80 Pasada 0: Lista entre 0 y 3. Selecciona el 21 y lo pasa al a[0] a[0] a[1] a[2] a[3] 21 51 90 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 90 80 Pasada 2: Lista entre 2 y 3. Selecciona el 80 y lo mueve al a[2]. a[0] a[1] a[2] a[3] 21 39 80 90
10 Codificación C: Ordenamiento por Selecciónvoid ordSeleccion (double a[], int n) { int indiceMenor, i, j; double 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 exploración 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) /* sitúa el elemento mas pequeño en a[i] */ { aux = a[i]; a[i] = a[indiceMenor]; a[indiceMenor] = aux ; } Complejidad n (n–1) Del Orden F(n)=n2.
11 Ordenación Por InserciónSimilar al proceso de ordenar tarjetas en un tarjetero por orden alfabético: Consiste en insertar un elemento en su posición 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 posición correcta, delante o detrás del a[0], según sea mayor o menor Por cada bucle i (desde i=1 hasta n–1) se explora la sublista a[0]..a[i–1] buscando la posición correcta de inserción del elemento a[i] Al dejar vacío la posición a[i] se impone un desplazamiento de todo el vector, desde el lugar de inserción.
12 Codificación en C: Ordenación por Inserciónvoid ordInsercion (int [] a, int n) { int i, j, aux; for (i = 1; i < n; i++) /* El índice j explora sublista a[i-1]..a[0] buscando posición correcta del elemento destino, para asignarlo en a[j] */ { j = i; aux = a[i]; /* se localiza el punto de inserción 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 (n–1) Del Orden F(n)=n2.
13 Ordenación Por BurbujaLos elementos burbujean: Los mas grandes, caen al fondo del array (posición n) Los mas chicos suben a la cima (posición 0). Estudia parejas de elementos Adyacentes a[0] y a[1], a[1] y a[2]…a[i] y a[i+1]… a[n–2] y a[n–1]. Si a[i+1] < a[i] Entonces Los INTERCAMBIA Algoritmo: Pasada 0: considera desde (a[0], a[1]) hasta (a[n–2], a[n–1]). En a[n–1] esta el elemento mas grande. Pasada 1: considera desde (a[0], a[1]) hasta (a[n–3], a[n–2]). En a[n–2] esta el segundo elemento mas grande. Pasada i: considera desde (a[0], a[1]) hasta (a[n–i–2], a[n-i–1]). En a[n–i–1] esta el elemento de orden i. El proceso termina con la pasada n–1 El elemento mas pequeño esta en a[0].
14 Ejemplo :Ordenación por BurbujaLista Original a[0] a[1] a[2] a[3] a[4] 50 20 40 80 30 Pasada 0: Pasada 2: Pasada 1: Intercambio 50 y 20 a[0] a[1] a[2] a[3] a[4] 20 50 40 80 30 Ordenados: 20 y 40, 40 y 50. a[0] a[1] a[2] a[3] a[4] 20 40 50 30 80 Intercambio 40 y 30 a[0] a[1] a[2] a[3] a[4] 20 30 40 50 80 Lista Ordenada Intercambio 50 y 40 a[0] a[1] a[2] a[3] a[4] 20 40 50 80 30 Intercambio 50 y 30 a[0] a[1] a[2] a[3] a[4] 20 40 30 50 80 NO Intercambia 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
15 Codificación C Ordenación por Burbujavoid ordBurbuja (long a[], int n) { int interruptor = 1; int pasada, j; for (pasada = 0; pasada < n-1 && interruptor; pasada++) { long aux; /* bucle externo controla la cantidad de pasadas */, interruptor = 0; for (j = 0; j < n-pasada-1; j++) if (a[j] > a[j+1]) /* elementos desordenados, es necesario intercambio */ { interruptor = 1; aux = a[j]; a[j] = a[j+1]; a[j+1] = aux; } Mejor Caso: en una lista ordenada, hará una sola pasada: F(n)=n Peor Caso: F(n)=n2
16 Ordenación Shell Debe su nombre a su inventor D.L.Shell. AlgoritmoModifica los saltos contiguos del método de burbuja a saltos variables que se achican. Inicia con Intervalo del orden n/2 y luego tiende a 1. Algoritmo Dividir lista original en n/2 grupos de 2 elementos, Intervalo entre los elementos: n/2. Clarificar cada grupo por separado, comparando parejas de elementos. Si No Están Ordenados Entonces CAMBIARLOS. Dividir lista original en n/4 grupos de 4 elementos, Intervalo entre los elementos: n/4. Continuar sucesivamente hasta que el intervalo==1.
17 Ejemplo: Ordenación ShellLista Original n=6. Intervalo Inicial: n/2=6/2=3 Intervalos Siguientes=IntervaloAnterior/2 Se compara a[i] con a[i+Intervalo] Si No Están Ordenados Entonces CAMBIARLOS a[0] a[1] a[2] a[3] a[4] a[5] a[6] 6 1 5 2 3 4 Paso Intervalo Parejas que Intercambian por estar desordenados La Lista Queda 1 3 (6,2)= 2, 1, 5,6, 3, 4, 0 (5,4)= 2, 1, 4,6, 3,5, 0 (6;0)=2, 1, 4,0, 3,5, 6 2, 1, 4,0, 3,5, 6 2 (2, 0)=0, 1, 4,2, 3,5, 6 0, 1, 4,2, 3,5, 6 Ninguno 4 3/2=1 (4, 2)=0, 1, 2,4, 3,5, 6 (4, 3)= 0, 1, 2,3,4,5, 6 0, 1, 2,3, 4,5, 6 5 Lista Ordenada
18 Codificación en C: Ordenamiento Shellvoid ordenacionShell(double a[], int n) { int i, j, k, intervalo = n / 2; double temp; while (intervalo > 0) { for (i = intervalo; i ≤ n; i++) { j = i - intervalo; while (j >= 0) { k = j + intervalo; //queda k=i; if (aj <= ak) j = -1; /*termina el bucle, par ordenado */ else{ temp = a[j]; a[j] = a[k]; a[k] = temp; j -= intervalo; } intervalo = intervalo / 2; El 1er while: Log2n El for: n F(n)=n*Log2(n)
19 Búsqueda Encontrar una CLAVE especifica dentro de un Almacén, donde existe un campo con la clave que se referencia. Si está en la lista, informa su posición. Si el Almacén Está Ordenado la búsqueda puede ser mas eficiente.
20 Búsqueda Dos Tipos de Búsqueda:Secuencial: Busca la clave explorando un elemento después de otro. Es la única forma de encontrarlo cuando la Lista no está Ordenada por la Clave de Búsqueda. Eficiencia del Orden de F(n)=n. Binaria: En listas Ordenadas por la clave de Búsqueda es el mejor método. Se sitúa la lectura al centro de la lista y se lo comprueba contra la clave. Si clave < a[central]: Buscar entre inferior y central–1 Si clave > a[central]: Buscar entre central+1 y superior Eficiencia del Orden F(n)=log2n
21 Codificación C Búsqueda Binaria Iterativa/* búsqueda binaria. devuelve el índice del elemento buscado, o bien -1 caso de fallo*/ int busquedaBin(int lista[], int n, int clave) { int central, bajo, alto, valorCentral; bajo = 0; alto = n-1; while (bajo <= alto) { central = (bajo + alto)/2; /* índice de elemento central */ valorCentral = lista[central];/* valor del índice central */ if (clave == valorCentral) return central; /* devuelve posición */ else if (clave < valorCentral) alto = central -1; /*sublista inferior*/ else bajo = central + 1; /* ir a sublista superior */ } return -1; /* elemento no encontrado */
22 Trabajos Prácticos
23 Trabajos Prácticos Plantear un método de Ordenación.Realizar el Algoritmo y una prueba de escritorio Analizar la complejidad. Estudiar su rendimiento en comparación a los otros métodos. Plantear un método de Búsqueda.