Ordenamiento y Búsqueda Facultad de Ciencias de la Computación Juan Carlos Conde R. Object-Oriented Programming I
Contenido 1 Introducción 2 Intercambio directo 3 Inserción directa 4 Selección directa 5 Métodos Avanzados 6 Métodos de Búsqueda 1 / 34
Contenido 1 Introducción 2 Intercambio directo 3 Inserción directa 4 Selección directa 5 Métodos Avanzados 6 Métodos de Búsqueda 2 / 34
Concepto de Clasicación I La clasicación se dene como el proceso de reacomodar un conjunto de objetos en un orden especíco. Su nalidad es facilitar la búsqueda posterior de los miembros pertenecientes al conjunto clasicado. En todo lugar donde se guarden objetos, que luego es necesario recuperar, se lleva a cabo un procesos de clasicación. Por ejemplo: en una biblioteca, en los diccionarios, en las bodegas, etc. 3 / 34
Concepto de Clasicación II Debido a la dependencia entre el algoritmo a utilizar y la estructura de los datos por procesar, los métodos de clasicación se dividen en: 1. Clasicación interna (de arreglos). Se produce en la memoria de la computadora. 2. Clasicación externa (de archivos). Es necesaria cuando el número de objetos es demasiado grande que no cabe en la memoria principal. 4 / 34
Clasicación Interna I Existen muchos métodos de clasicación interna; algunos directos y otros más renados. En general: los algoritmos más simples requieren más movimientos de elementos y comparaciones, los algoritmos renados son más complejos en su implementación. 5 / 34
Clasicación Interna II Vamos a suponer que los objetos a clasicar son registros que contienen uno o más campos. Uno de los campos, llamado clave, es de un tipo para el cual está denida la relación de ordenamiento lineal. La clave puede ser entera, real y de tipo carácter o cualquier otro tipo para la cual la relación "menos o igual que" o "menor que" este denida. 6 / 34
Clasicación Interna III El problema de la clasicación consisten en ordenar una secuencia de registros de tal forma que los valores de sus claves formen una secuencia creciente. Esto es, dados los registros: r 1, r 2,..., r n, con valores de clave k 1, k 2,..., k n, respectivamente, debe resultar la misma secuencia de registros en orden: r i1, r i2,..., r in, tal que k i1 k i2... k in. 7 / 34
Clasicación Interna IV Los métodos de clasicación interna pueden dividirse en tres categorías principales según el método en el que se basan: 1. Clasicación por intercambio 2. Clasicación por inserción 3. Clasicación por selección 8 / 34
Contenido 1 Introducción 2 Intercambio directo 3 Inserción directa 4 Selección directa 5 Métodos Avanzados 6 Métodos de Búsqueda 9 / 34
Método de la Burbuja I Uno de los métodos de clasicación más simples que puede haber es el llamado "clasicación de burbuja" (bubblesort). la idea básica de este algoritmo es imaginar que los elementos son como burbujas en un tanque de agua con pesos correspondientes a sus claves, cada pase sobre el arreglo produce el ascenso de una burbuja hasta su nivel adecuado de peso. 10 / 34
Método de la Burbuja II Vamos a suponer que tenemos un arreglo de registros A, el número de registros a ordenar es n, y que el campo clave contiene la clave del registro. El algoritmo de burbuja en su versión más sencilla se presenta a continuación: Procedimiento burbuja( A[], n ) Inicio Para i 1 hasta n-1 hacer Para j n hasta i+1 hacer Si A[j].clave < A[j-1].clave entonces Intercambiar( A[j], A[j-1] ) Fin_si Fin_para Fin_para Fin_burbuja 11 / 34
Método de la Burbuja III El algoritmo Intercambiar se presenta a continuación: Procedimiento Intercambiar( x, y ) Inicio tmp x x y y tmp Fin Si aplicamos el algoritmo a un arreglo de enteros como el siguiente, los recorridos que se obtienen son: Arreglo A = { 6, 9, 12, 67, 3, 0, 2 } con n = 7. Obsérvese que en este caso no es necesario declarar un arreglo de registros. 12 / 34
Método de la Burbuja IV RECORRIDO RESULTADO i=1 0, 6, 9, 12, 67, 3, 2 i=2 0, 2, 6, 9, 12, 67, 3 i=3 0, 2, 3, 6, 9, 12, 67 i=4 0, 2, 3, 6, 9, 12, 67 i=5 0, 2, 3, 6, 9, 12, 67 i=6 0, 2, 3, 6, 9, 12, 67 Este algoritmo admite mejoras. En el ejemplo anterior se puede observar que en las últimas 3 iteraciones ya no hay intercambios, tomando en cuenta esto, el algoritmo se puede mejorar. 13 / 34
Método de Vibración El algoritmo por vibración es una variante del algoritmo burbuja pero mejorado. Este algoritmo consiste en "recordar" cuál fue el último intercambio realizado y en qué momento. Procedimiento shakesort( A[], n ) Inicio l 2 r n k n Repetir Para j r hasta l hacer Si A[j-1] > A[j] entonces Intercambiar( A[j-1], A[j] ) k j Fin_si Fin_para l k+1 Para j l hasta r hacer Si A[j-1] > A[j] entonces Intercambiar( A[j-1], A[j] ) k j Fin_si Fin_para r k-1 Hasta l > r Fin_shakesort 14 / 34
Contenido 1 Introducción 2 Intercambio directo 3 Inserción directa 4 Selección directa 5 Métodos Avanzados 6 Métodos de Búsqueda 15 / 34
Método de Inserción Directa I Este método consiste en reubicar en el lugar correcto cada uno de los N elementos a ordenar, es decir, en el i-ésimo recorrido se "inserta" el i-ésimo elemento A[i] en el lugar correcto, entre A[1], A[2],..., A[N], los cuales fueron ordenados previamente. Existen dos condiciones distintas que podrían dar terminado el proceso de clasi- cación: 1. Se encuentra un elemento A[j] que tiene una clave menor que la de A[i] 2. El extremo izquierdo de la secuencia destino es alcanzado 16 / 34
Método de Inserción Directa II Para facilitar el proceso de mover A[i], es útil usar la técnica del centinela, en A[1], cuya clave es igual a la de A[i]. El algoritmo se muestra a continuación: Procedimiento inserciondirecta( A[], n ) Inicio Para i 2 hasta n hacer aux A[i] j i Mientras j > 1 y aux < A[j-1] hacer Intercambiar( A[j], A[j-1] ) j j-1 Fin_mientras A[j] aux Fin_para Fin_inserciondirecta 17 / 34
Método de Inserción Directa III Nótese que la secuencia destino A[2]... A[i-1], donde se debe insertar el elemento, ya está ordenada así que este algoritmo puede ser mejorado determinando el punto de inserción. La elección es una búsqueda binaria* que prueba la secuencia destino en la mitad y continúa buscando hasta encontrar el punto de inserción. Este algoritmo de inserción modicado recibe el nombre de Inserción Binaria y se presenta a continuación: 18 / 34
Método de Inserción Binaria I Procedimiento insercionbinaria( A[], n ) Inicio Para i 2 hasta n hacer x A[i] l 1 r i Mientras l < r hacer m ( (l+r) / 2 ) Si A[m] <= x entonces l l+1 Sino r m Fin_si Fin_mientras Para j i hasta r+1 (decremento en 1) hacer A[j] A[j-1] Fin_para A[r] x Fin_para Fin_insercionbinaria 19 / 34
Método de Inserción Binaria II En el algoritmo anterior se observa que a veces, en lugar de mejorar el algoritmo, este se deteriora puesto que hay que realizar más pasos por la inserción de un elemento. Esto implica ½mayor tiempo! Directa. que el utilizado por la clasicación de Inserción 20 / 34
Contenido 1 Introducción 2 Intercambio directo 3 Inserción directa 4 Selección directa 5 Métodos Avanzados 6 Métodos de Búsqueda 21 / 34
Método de Selección Directa I Este método se basa en los siguientes principios: 1. Seleccionar el elemento que tenga la clave menor 2. Intercambiarlo con el primer elemento A[1] 3. Repetir después estas operaciones con los n 1 elementos restantes, luego con n 2 elementos hasta que no quede más que un elemento (el más grande) 22 / 34
Método de Selección Directa II Procedimiento selecciondirecta( A[], n ) Inicio Para i 1 hasta n-1 hacer aux A[i] k i Para j i+1 hasta n hacer if A[j] < aux entonces k j aux A[k] Fin_si Fin_para A[k] A[i] A[i] aux Fin_para Fin_selecciondirecta 23 / 34
Contenido 1 Introducción 2 Intercambio directo 3 Inserción directa 4 Selección directa 5 Métodos Avanzados 6 Métodos de Búsqueda 24 / 34
Inserción por decremento decreciente Un renamiento de la inserción directa fue propuesto por D.L. Shell en 1959. Procedimiento shellsort( A[], n ) Inicio inc n Hacer inc inc/2 Para k 1 hasta inc Para i inc+k hasta n (incremento i i+inc) j i Mientras j-inc>0 y A[j]<A[j-inc] Intercambiar( A[j], A[j-inc] ) j j-inc Fin_mientras Fin_para Fin_para Hasta inc<=1 Fin_shellsort 25 / 34
Método por Partición I A este método también se le conoce como clasicación rápida o Quicksort y su inventor fue C.A.R. Hoare. Este método se basa en el hecho de que los intercambios han de efectuarse en distancias largas para que logren su máxima eciencia. El procedimiento se activa a sí mismo recursivamente. 26 / 34
Método por Partición II Procedimiento quicksort(a[], L, R) Inicio i L j R pivote A[(L+J) / 2] Repetir Mientras A[i] < pivote hacer i i+1 Fin_mientras Mientras pivote < A[j] hacer j j-1 Fin_mientras Si i <= j entonces Intercambiar(A[i], A[j]) i i+1 j j-1 Fin_si Hasta i > j Si L < j entonces quicksort(a, L, j) Fin_si Si i < R entonces quicksort(a, i, R) Fin_si Fin_quicksort 27 / 34
Contenido 1 Introducción 2 Intercambio directo 3 Inserción directa 4 Selección directa 5 Métodos Avanzados 6 Métodos de Búsqueda 28 / 34
Concepto de Búsqueda La tarea de búsqueda es una de las más frecuentes en programación. Comúnmente cada elemento de la colección es un registro con un campo que actúa como una "clave"; la tarea consiste en hallar un elemento cuya clave sea igual al argumento de búsqueda. Para los siguientes algoritmos vamos a suponer que la colección de los datos en donde vamos a buscar es ja y de tamaño n. 29 / 34
Búsqueda Lineal I Cuando los elementos no llevan un orden o no hay información sobre ellos se utiliza la búsqueda lineal, es decir, comparar uno a uno los elementos hasta encontrar el deseado. Existen dos condiciones que ponen n a la búsqueda: 1. Se encuentra el elemento 2. Se ha rastreado toda la colección y no se encuentra el elemento 30 / 34
Búsqueda Lineal II Procedimiento búsquedalineal(a[], n, elemento) Inicio i 1 Mientras (i <= n) y (A[i] <> elemento) hacer i i+1 Fin_mientras Fin_busquedalineal Si i al nal es n entonces el elemento no fue encontrado, pero sino entonces quiere decir que el elemento esta en la posición i-ésima del arreglo. 31 / 34
Búsqueda Binaria I Para utilizar este algoritmo es necesario que la colección este ordenada, así se puede acelerar el proceso de búsqueda. La idea clave consiste en: Inspeccionar un elemento elegido al azar, por ejemplo A[m] y compararlo con el elemento de búsqueda x, Si es igual a x, la búsqueda termina, Si es menor que x, inferimos que todos los elementos con índices menores que o iguales a m pueden ser eliminados, y nuestra búsqueda ahora se centra en los demás elementos. Esto se repite mientras el índice inicial sea menor o igual que el nal (L y R) y el elemento no sea encontrado. 32 / 34
Búsqueda Binaria II Generalmente el elemento no se elige al azar, sino que se toma el elemento que se encuentra a la mitad del arreglo. Procedimiento busquedabinaria(a[], n, x) Inicio L 1 R n found false Mientras L<R y not (found) hacer m [(L+R) / 2] Si A[m]=x entonces found true Sino Si A[m] < x entonces L m+1 Sino R m Fin_si Fin_si Fin_mientras Fin_busquedabinaria 33 / 34
Un hombre con ideas es fuerte, un hombre con ideales es invensible Juan Carlos Conde R. juanc.conde@cs.buap.mx 34 / 34