cap 05 - métodos de ordenamiento y de búsqueda
TRANSCRIPT
Métodos de Ordenamiento y de Búsqueda
Prof. Robert Espinoza
Métodos de Ordenamiento
Ordenar significa reagrupar o reorganizar un conjunto de datos u objetos en una secuencia específica.
Formalmente se define de la siguiente manera: Sea A una lista de elementos
A1, A2, A3, …, An Ordenar es clasificar estos elementos para que queden
según una distribución establecida. Ascendente:
A1 ≤ A2 ≤ A3 ≤ … ≤ An Descendente:
A1 ≥ A2 ≥ A3 ≥ … ≥ An
Introducción
Ordenación interna Los elementos se encuentran en la memoria principal de
la computadora. También conocida como ordenación de arreglos.
Ordenación externa Los elementos se encuentran almacenados en
dispositivos de almacenamiento secundario (discos, cintas, etc.)
También se le conoce como ordenación de archivos.
Introducción
Ordenación Interna
Métodos directos (n2) Implementación relativamente sencilla. Fáciles de comprender. Ineficientes cuando “n” es mediano o grande.
Métodos logarítmicos (n*log n) Más complejos y menos intuitivos Elaboración más sofisticada Difíciles de comprender Son más eficientes pues requieren de menos
comparaciones y movimientos para clasificar los elementos.
Ordenación Interna
En conclusión: Cuando N es pequeño deben utilizarse métodos
directos. Cuando N es mediano o grande deben emplearse
métodos logarítmicos.
Ordenación por intercambio (Burbuja)
Para un ordenamiento ascendente, podemos trabajar de dos formas diferentes: Llevar los elementos menores hacia la parte
izquierda del arreglo, o Desplazar los elementos mayores hacia la derecha.
En el caso de una clasificación descendente se opera de manera contraria. Llevar los elementos mayores hacia la parte
izquierda del arreglo, o Desplazar los elementos menores hacia la derecha.
Es quizás el método más ineficiente.
Ordenación por intercambio (Burbuja)
Consiste básicamente en lo siguiente: Comparar pares de elementos adyacentes e
intercambiarlos entre sí hasta que todos se encuentren ordenados.
Se realizan (n-1) pasadas transportando en cada una de ellas el mayor o menor elemento, según sea el caso a su posición ideal.
Al final de las (n-1) pasadas los elementos estarán ordenados
Ordenación por intercambio (Burbuja)
Ordenación ascendente llevando el menor a la izquierda. Comparamos los elementos adyacentes
comenzando con el penúltimo y último elementos. Intercambiamos si un elemento es mayor que el
siguiente, es decir vamos desplazando el menor a la izquierda.
Retrocedemos hasta llegar al primer elemento en la primera pasada, al segundo en la segunda pasada y así sucesivamente.
Finalmente el arreglo quedará ordenado.
Ordenación por intercambio (Burbuja)
15 67 8 16 44 27 12 35
Ejemplo: Ordenar ascendentemente llevando el menor a la izquierda
Ordenación por intercambio (Burbuja)
15 67 8 16 44 27 12 35
15 67 8 16 44 27 12 35
15 67 8 16 44 12 27 35
15 67 8 16 12 44 27 35
15 67 8 12 16 44 27 35
15 67 8 12 16 44 27 35
15 8 67 12 16 44 27 35
8 15 67 12 16 44 27 35
A[6] > A[7]
A[5] > A[6]
A[4] > A[5]
A[3] > A[4]
A[1] > A[2]
A[2] > A[3]
A[0] > A[1]
No intercambio
Intercambio
Intercambio
Intercambio
Intercambio
Intercambio
No intercambio
Primera pasada
Ordenación por intercambio (Burbuja)
8 15 67 12 16 44 27 35
8 15 67 12 16 44 27 35
8 15 67 12 16 27 44 35
8 15 67 12 16 27 44 35
8 15 67 12 16 27 44 35
8 15 12 67 16 27 44 35
8 12 15 67 16 27 44 35
A[6] > A[7]
A[5] > A[6]
A[4] > A[5]
A[3] > A[4]
A[1] > A[2]
A[2] > A[3]
No intercambio
Intercambio
No intercambio
No intercambio
Intercambio
Intercambio
Segunda pasada
Ordenación por intercambio (Burbuja)
8 12 15 67 16 27 44 35
8 12 15 67 16 27 35 44
8 12 15 67 16 27 35 44
8 12 15 67 16 27 35 44
8 12 15 16 67 27 35 44
8 12 15 16 67 27 35 44
A[6] > A[7]
A[5] > A[6]
A[4] > A[5]
A[3] > A[4]
A[2] > A[3]
Intercambio
No intercambio
No intercambio
Intercambio
No intercambio
Tercera pasada
Ordenación por intercambio (Burbuja)
8 12 15 16 67 27 35 44
8 12 15 16 67 27 35 44
8 12 15 16 67 27 35 44
8 12 15 16 27 67 35 44
8 12 15 16 27 67 35 44
A[6] > A[7]
A[5] > A[6]
A[4] > A[5]
A[3] > A[4]
No intercambio
No intercambio
Intercambio
No intercambio
Cuarta pasada
Ordenación por intercambio (Burbuja)
8 12 15 16 27 67 35 44
8 12 15 16 27 67 35 44
8 12 15 16 27 35 67 44
8 12 15 16 27 35 67 44
A[6] > A[7]
A[5] > A[6]
A[4] > A[5]
No intercambio
Intercambio
No intercambio
Quinta pasada
Ordenación por intercambio (Burbuja)
8 12 15 16 27 35 67 44
8 12 15 16 27 35 44 67
8 12 15 16 27 35 44 67
A[6] > A[7]
A[5] > A[6]
Intercambio
No intercambio
Sexta pasada
Ordenación por intercambio (Burbuja)
8 12 15 16 27 35 44 67
8 12 15 16 27 35 44 67
A[6] > A[7] No intercambio
Sétima pasada
Ordenación por intercambio (Burbuja)
Algoritmo de ordenación pasando el menor hacia la izquierda
Método Burbuja_menor(A,N)
Para I desde 1 hasta N-1 hacer
Para J desde N-1 hasta I
Si A(J-1) > A(J) entonces
aux A[J-1]
A[J-1] A[J]
A[J] aux
FinSi
FinPara
FinPara
Fin Método
Ordenación por intercambio (Burbuja)
15 67 8 16 44 27 12 35
Ejemplo: Ordenar ascendentemente pasando el mayor hacia la parte derecha
Ordenación por intercambio (Burbuja)
15 67 8 16 44 27 12 35
15 67 8 16 44 27 12 35
15 8 67 16 44 27 12 35
15 8 16 67 44 27 12 35
15 8 16 44 67 27 12 35
15 8 16 44 27 67 12 35
15 8 16 44 27 12 67 35
15 8 16 44 27 12 35 67
A[0] > A[1]
A[1] > A[2]
A[2] > A[3]
A[3] > A[4]
A[5] > A[6]
A[4] > A[5]
A[6] > A[7]
No intercambio
Intercambio
Intercambio
Intercambio
Intercambio
Intercambio
Intercambio
Primera pasada
Ordenación por intercambio (Burbuja)
15 8 16 44 27 12 35 67
8 15 16 44 27 12 35 67
8 15 16 44 27 12 35 67
8 15 16 44 27 12 35 67
8 15 16 27 44 12 35 67
8 15 16 27 12 44 35 67
8 15 16 27 12 35 44 67
A[0] > A[1]
A[1] > A[2]
A[2] > A[3]
A[3] > A[4]
A[5] > A[6]
A[4] > A[5]
Intercambio
No intercambio
No intercambio
Intercambio
Intercambio
Intercambio
Segunda pasada
Ordenación por intercambio (Burbuja)
8 15 16 27 12 35 44 67
8 15 16 27 12 35 44 67
8 15 16 27 12 35 44 67
8 15 16 27 12 35 44 67
8 15 16 12 27 35 44 67
8 15 16 12 27 35 44 67
A[0] > A[1]
A[1] > A[2]
A[2] > A[3]
A[3] > A[4]
A[4] > A[5]
No intercambio
No intercambio
No intercambio
Intercambio
No intercambio
Tercera pasada
Ordenación por intercambio (Burbuja)
8 15 16 12 27 35 44 67
8 15 16 12 27 35 44 67
8 15 16 12 27 35 44 67
8 15 12 16 27 35 44 67
8 15 12 16 27 35 44 67
A[0] > A[1]
A[1] > A[2]
A[2] > A[3]
A[3] > A[4]
No intercambio
No intercambio
Intercambio
No intercambio
Cuarta pasada
Ordenación por intercambio (Burbuja)
8 15 12 16 27 35 44 67
8 15 12 16 27 35 44 67
8 12 15 16 27 35 44 67
8 12 15 16 27 35 44 67
A[0] > A[1]
A[1] > A[2]
A[2] > A[3]
No intercambio
Intercambio
No intercambio
Quinta pasada
Ordenación por intercambio (Burbuja)
8 12 15 16 27 35 44 67
8 12 15 16 27 35 44 67
8 12 15 16 27 35 44 67
A[0] > A[1]
A[1] > A[2]
No intercambio
No intercambio
Sexta pasada
Ordenación por intercambio (Burbuja)
8 12 15 16 27 35 44 67
8 12 15 16 27 35 44 67
A[0] > A[1] No intercambio
Sétima pasada
Ordenación por intercambio (Burbuja)
Algoritmo de ordenación pasando el menor hacia la izquierda
Método Burbuja_mayor(A,N)
Para I desde N-2 hasta 0 hacer
Para J desde 0 hasta I
Si A(J) > A(J+1) entonces
aux A[J]
A[J] A[J+1]
A[J+1] aux
FinSi
FinPara
FinPara
Fin Método
Análisis de eficiencia del Método por intercambio (Burbuja)
Número de comparaciones: Primera pasada: (n-1), segunda pasada: (n-2), tercera
pasada: (n-3) y así sucesivamente hasta llegar a 2 y 1. Por lo tanto el número de comparaciones C es:
2
2
)1(*12)2()1(
2 nnC
nnnnC
Análisis de eficiencia del Método por intercambio (Burbuja)
El número de movimientos o intercambios dependen de si el arreglo se encuentra: En orden inverso (caso peor)
Mmáx = 3 * (n2 – n) / 2 = 1.5 * (n2 – n) Desordenado o aleatorio (caso medio)
Mmed = 0.75 * (n2 – n)
Ordenado (caso mejor)
Mmín = 0
El tiempo necesario para ejecutar el algoritmo de la burbuja es proporcional a n2
T(n) = O(n2)
Análisis de eficiencia del Método por intercambio (Burbuja)
Por ejemplo si son 100 elementos a ordenar tenemos Caso mejor (Ordenado)
4,950 comparaciones 0 movimientos
Caso medio (aleatorio) 4,950 comparaciones 7,425 movimientos
Caso peor (en orden inverso) 4,950 comparaciones 14,850 movimientos
Es una modificación del método de la burbuja con la finalidad de terminar la ejecución del algoritmo en caso se compruebe que el arreglo ya está ordenado después de una pasada.
La idea central es utilizar una señal o marca para indicar que no se ha producido ningún intercambio en una pasada, lo que comprueba que el arreglo está completamente ordenado.
Método de intercambio con señal (flag)
Método Burbuja_señal (A,N)
i 1, flag VERDADERO
Mientras i <= N-1 y flag = VERDADERO hacer
flag FALSO
Para j desde 0 hasta n-2 hacer
Si A[ j ] > A[ j+1 ] entonces
aux A[ j ], A[ j ] A [ j+1], A[ j+1] aux
flag VERDADERO
Fin Si
FinPara
i i + 1
FinMientras
Fin Método
Método de intercambio con señal (flag)
Ordenación por Inserción directa
También conocido como Método de la Baraja por ser el que usan los jugadores de cartas para ordenar la baraja.
La idea central consiste en insertar un elemento en su parte izquierda, que ya se encuentra ordenada. Este proceso se repite desde el segundo hasta el último elemento.
Ordenación por Inserción directa
15 67 8 16 44 27 12 35
Por ejemplo, ordenar ascendentemente usando el método de inserción directa
Ordenación por Inserción directa
15 67 8 16 44 27 12 35
15 67 8 16 44 27 12 35
A[1] < A[0] No intercambio
Primera pasada
Ordenación por Inserción directa
15 67 8 16 44 27 12 35
15 8 67 16 44 27 12 35
8 15 67 16 44 27 12 35
A[2] < A[1]
A[1] < A[0]
Intercambio
Intercambio
Segunda pasada
Ordenación por Inserción directa
8 15 67 16 44 27 12 35
8 15 16 67 44 27 12 35
8 15 16 67 44 27 12 35
A[3] < A[2]
A[2] < A[1]
Intercambio
No Intercambio
Tercera pasada
Ordenación por Inserción directa
8 15 16 67 44 27 12 35
8 15 16 44 67 27 12 35
8 15 16 44 67 27 12 35
A[4] < A[3]
A[3] < A[2]
Intercambio
No Intercambio
Cuarta pasada
Ordenación por Inserción directa
8 15 16 44 67 27 12 35
8 15 16 44 27 67 12 35
8 15 16 27 44 67 12 35
A[5] < A[4]
A[4] < A[3]
Intercambio
Intercambio
Quinta pasada
A[3] < A[2] No Intercambio
8 15 16 27 44 67 12 35
Ordenación por Inserción directa
8 15 16 27 44 67 12 35
8 15 16 27 44 12 67 35
8 15 16 27 12 44 67 35
A[6] < A[5]
A[5] < A[4]
Intercambio
Intercambio
Sexta pasada
A[4] < A[3] Intercambio
8 15 16 12 27 44 67 35 A[3] < A[2] Intercambio
8 15 12 16 27 44 67 35 A[2] < A[1] Intercambio
8 12 15 16 27 44 67 35 A[1] < A[0] No intercambio
8 12 15 16 27 44 67 35
Ordenación por Inserción directa
8 12 15 16 27 44 67 35
8 12 15 16 27 44 35 67
8 12 15 16 27 35 44 67
A[7] < A[6]
A[6] < A[5]
Intercambio
Intercambio
Sétima pasada
A[5] < A[4] No intercambio
8 12 15 16 27 35 44 67
Método Inserción (A,N)
Para i desde 1 hasta N-1 hacer
aux A[ i ]
k i - 1
Mientras (k >= 0) y (aux < A[ k ]) hacer
A[ k+1 ] A[ k ]
k k - 1
FinMientras
A[ k+1 ] aux
FinPara
Fin Método
Ordenación por Inserción directa
El número mínimo de comparaciones y movimientos sucede cuando los elementos ya está ordenados Número de comparaciones
Cmín = n – 1 Número de movimientos.
Mmín = 0
El número máximo de comparaciones y movimientos entre elementos se da cuando los elementos del arreglo están en orden inverso. Número de comparaciones
Cmáx = 1 + 2 + … + (n-1) = n * (n-1) / 2 = (n2 – n) / 2
Número de movimientos
Mmáx = 1 + 2 + … + (n-1) = n * (n-1) / 2 = (n2 – n) / 2
Análisis de eficiencia del método de Inserción directa
El número de comparaciones y movimientos promedio se da cuando los elementos aparecen aleatoriamente.
Se calcula sumando las comparaciones y movimientos máximos y mínimos entre 2. Número de comparaciones
Análisis de eficiencia del método de Inserción directa
Número de movimientos.
4
)2(
2
2
)()1(
2
2
nn
nnn
Cmed
4
)(
2
2
)(0
2
2
nn
nn
M med
Análisis de eficiencia del método de Inserción directa
Por ejemplo si son 100 elementos a ordenar tenemos Caso mejor (Ordenado)
99 comparaciones 0 movimientos
Caso medio (aleatorio) 2,524 comparaciones 2,475 movimientos
Caso peor (en orden inverso) 4,950 comparaciones 4,950 movimientos
Es más eficiente que los anteriores, sin embargo no se recomienda utilizarlo si el número de elementos del arreglo es mediano o grande.
La idea básica es buscar el menor elemento y colocarlo en la primera posición.
Luego se busca el segundo más pequeño y se coloca en la segunda posición.
Y así sucesivamente hasta que todos los elementos hayan sido ordenados.
Método por Selección directa
Método por selección directa
15 67 8 16 44 27 12 35
Por ejemplo ordenar ascendentemente utilizando el método de selección directa
Primera pasada Se haya el menor que es A[2] = 8 Se intercambia con el primero A[0] Luego el arreglo queda de la siguiente manera:
Método por selección directa
8 67 15 16 44 27 12 35
Segunda pasada Se haya el segundo menor que es A[6] = 12 Se intercambia con el segundo A[1] Luego el arreglo queda de la siguiente manera:
Método por selección directa
8 12 15 16 44 27 67 35
Tercera pasada Se haya el tercer menor que es A[2] = 15 Se intercambia con el tercero A[2] Luego el arreglo queda de la siguiente manera:
Método por selección directa
8 12 15 16 44 27 67 35
Cuarta pasada Se haya el cuarto menor que es A[3] = 16 Se intercambia con el cuarto A[3] Luego el arreglo queda de la siguiente manera:
Método por selección directa
8 12 15 16 44 27 67 35
Quinta pasada Se haya el quinto menor que es A[5] = 27 Se intercambia con el quinto A[4] Luego el arreglo queda de la siguiente manera:
Método por selección directa
8 12 15 16 27 44 67 35
Sexta pasada Se haya el sexto menor que es A[7] = 35 Se intercambia con el sexto A[5] Luego el arreglo queda de la siguiente manera:
Método por selección directa
8 12 15 16 27 35 67 44
Sétima pasada Se haya el sétimo menor que es A[7] = 44 Se intercambia con el sétimo A[6] Luego el arreglo queda de la siguiente manera,
completamente ordenado:
Método por selección directa
8 12 15 16 27 35 44 55
Método Selección (A,N)
Para i desde 0 hasta N-2 hacer
menor A[ i ], k i
Para j desde i+1 hasta N-1 hacer
Si A[ j ] < menor entonces
menor A[ j ], k j
Fin Si
Fin Para
A[ k ] A[ i ]
A[ i ] menor
Fin Para
Fin Método
Método por selección directa
Análisis de eficiencia del Método por selección directa
El número de comparaciones es independiente de la disposición inicial de los elementos en el arreglo.
En la primera pasada se realizan (n-1) comparaciones En la segunda (n-2) comparaciones Y así sucesivamente hasta 2 y 1 comparaciones en la
penúltima y última pasadas. Por consiguiente el número de comparaciones C es:
2
2
)1(*12)2()1(
2 nnC
nnnnC
Análisis de eficiencia del Método por selección directa
El número de movimientos o intercambios siempre será:
1nM
Por ejemplo si son 100 elementos a ordenar tenemos para los casos mejor, peor y medio:
4950 comparaciones 99 movimientos
Método Shell
El método de Shell es una versión mejorada del método de inserción directa.
Lo propuso Donald L. Shell en 1959. También se le conoce como ordenamiento por
disminución del incremento o inserción con incrementos decrecientes.
Propone que las comparaciones entre elementos se efectúen con saltos de mayor tamaño pero con incrementos decrecientes para que los elementos queden ordenados más rápidamente.
Método Shell
Imaginemos un arreglo de 16 elementos. Se dividen los elementos en ocho grupos teniendo en
cuenta los elementos a ocho posiciones de distancia entre sí y se ordenan por separado.
Luego se dividen en cuatro grupos, teniendo en cuenta los elementos que se encuentren a cuatro posiciones entre sí, y se les ordena por separado.
Se dividen en grupos tomando en cuenta los que se encuentran a dos posiciones entre sí y nuevamente se les ordena por separado.
Finalmente se agrupan y ordenan de manera normal, de uno en uno.
Método Shell - Ejemplo
Se desea ordenar:
15, 67, 08, 16, 44, 27, 12, 35, 56, 21, 13, 28, 60, 36, 07, 10
1515 6767 0808 1616 4444 2727 1212 3535 5656 2121 1313 2828 6060 3636 0707 10101ra. Pasada:1ra. Pasada:
1515 67670808 1616 4444 2727 1212 353556562121 1313 2828 6060 36360707 1010
1515 67670808 1616 4444 2727 1212353556562121 1313 2828606036360707 10102ra. Pasada:2ra. Pasada:
1515 67670808 16164444 2727 1212 353556562121 13132828 606036360707 1010
Clasificación por Shell
1515 67670808 16164444 2727 1212 353556562121 13132828606036360707 10103ra. Pasada:3ra. Pasada:
1515 67670808 1616 444427271212 3535 56562121 1313 2828 6060363607071010
4ta. Pasada:4ta. Pasada: 1515 67670808 1616 444427271212 353556562121 1313 2828 6060363607071010
1515 67670808 1616 444427271212 3535 565621211313 2828 606036360707 1010
Método Shell (A, N) int N + 1 Mientras (int > 1) hacer
int entero(int / 2), band verdadero Mientras (band = verdadero) hacer
band falso, i 0 Mientras ( i + int ) <= N - 1 ) hacer Si A[ i ] > A [ i + int] entonces
aux A[i], A[ i ] A[ i+1], A[ i+1] auxband verdadero
Fin Si i i + 1 Fin Mientras
Fin Mientras Fin MientrasFin Método
Método Shell
Análisis de la eficiencia del Método Shell
Se han llevado acabo varios estudios de la Clasificación por Shell, pero ninguno ha demostrado que una opción de los incrementos sea muy superior al resto.
En 1969 Pratt descubrió que el tiempo de ejecución del algoritmo es del orden n*(log n)2.
Se han efectuado estudios empíricos sumamente amplios y al parecer, cuando n es grande, el número de movimientos fluctúa entre n5/4 y 1.6n5/4.
Método QuickSort (Ordenación rápida)
Este método es el más eficiente y veloz de los métodos de ordenación interna.
Conocido como método de ordenación rápida y de ordenación por partición.
Este método es una mejora sustancial del método de intercambio directo.
La idea del algoritmo es la siguiente: Se toma un elemento X de una posición cualquiera del
arreglo. Se trata de ubicar X en la posición correcta del arreglo,
de tal forma que todos los elementos que se encuentren a su izquierda sean menores o iguales a X y todos los que se encuentren a su derecha sean mayores o iguales a X.
Método QuickSort (Ordenación rápida)
Se repiten los pasos pero ahora con los conjuntos de datos que se encuentran a la izquierda y a la derecha de la posición correcta de X en el arreglo.
El proceso termina cuando todos los elementos se encuentran en su posición correcta en el arreglo.
Método QuickSort (Ordenación rápida)
Entonces procederemos de la siguiente manera: Se Selecciona un elemento X cualquiera, en nuestro
caso A[0] Se recorre el arreglo de derecha a izquierda,
comparando si los elementos son mayores o iguales a X Si un elemento no cumple con esta condición, se
intercambia con X y se almacena en una variable su posición (acotamos el arreglo por la derecha)
Se inicia nuevamente el recorrido pero ahora de izquierda a derecha, comparando si los elementos son menores o iguales a X.
Si no cumple la condición se intercambia con X y se almacena su posición (acotamos por la izquierda).
Se repiten los pasos anteriores hasta que X encuentra su posición correcta en el arreglo.
Método Quicksort
Por ejemplo ordenaremos ascendentemente:15, 67, 08, 16, 44, 27, 12, 35
Elegimos X = A[0] = 15 Primera pasada
Recorremos de derecha a izquierda A[7] >= X (35 >= 15) no hay intercambio A[6] >= X (12 >= 15) sí hay intercambio Queda como sigue:
12, 67, 08, 16, 44, 27, 15, 35 Ahora recorremos de izquierda a derecha
A[1] <= X (67<=15) sí hay intercambio Queda como sigue:
12, 15 , 08, 16, 44, 27, 67, 35
Método Quicksort
Segunda pasada Recorremos de derecha a izquierda
A[5] >= X (27>=15) no hay intercambio A[4] >= X (44 >=15) no hay intercambio A[3] >= X (16 >=15) no hay intercambio A[2] >= X (08 >=15) si hay intercambio Queda como sigue:
12, 08, 15, 16, 44, 27, 67, 35 Como el recorrido de izquierda a derecha se debería
iniciar en la misma posición donde se encuentra X, el proceso termina pues X está en la posición correcta.
12 08 15 16 44 27 35
1er conjunto 2do conjunto
Método Quicksort
Este proceso de particionamiento para localizar la posición correcta de un elemento X, se repite cada vez que queden conjuntos formados por dos o más elementos.
El método se puede aplicar de manera iterativa o recursiva
En la siguiente diapositiva se muestra el ordenamiento completo.
Método Quicksort
12 08 16 44 27 67 351ra. Pasada 15
0812 44 27 67 352da. Pasada 15 16
15 35 27 4408123ra. Pasada 16 67
15 16 35 4408 27124ra. Pasada 67
15 2716 4412 35085ta. Pasada 67
Método Quicksort (A,N)
ReduceQuicksort (0, N-1)
Fin Método
Método QuickSort – Algoritmo recursivo
Método ReduceQuicksort (INI, FIN)
izq INI, der FIN, pos INI, flag verdadero
Mientras (flag = verdadero) hacer
flag falso
Mientras (A[pos] <= A[der] ) y (pos <> der ) hacer
der der -1
Fin Mientras
Si (pos <> der ) entonces
aux A [pos], A[pos] A[der], A[der] aux, pos der
Mientras (A[pos] >= A[izq] ) y (pos <> izq ) hacer
izq izq +1
Fin Mientras
Método QuickSort – Algoritmo recursivo
Si (pos <> izq ) entonces
aux A [pos], A[pos] A[izq], A[izq] aux
pos izq, flag verdadero
Fin Si
Fin Si
Fin Mientras
Si (pos - 1 > INI) entonces
ReduceQuicksort (INI, pos - 1)
Fin Si
Si (FIN > pos + 1) entonces
ReduceQuicksort (pos + 1, FIN)
Fin Si
Fin Método
Método QuickSort – Algoritmo recursivo
Análisis de la eficiencia del método QuickSort
Si se escoge en cada pasada el elemento que ocupa la posición central, el número de pasadas es del orden de:
log n Si el tamaño del arreglo es una potencia de 2, el número
de comparaciones será:
C = (n-1) * log n El peor caso ocurre cuando los elementos ya están
ordenados o se encuentran en orden inverso.
Cmáx = n*(n+1)/2 -1
Cmáx = (n2 + n)/2 -1
Análisis de la eficiencia del método QuickSort
En conclusión Tiempo promedio de ejecución
n * log n, O(n * log n) Tiempo de ejecución en el peor caso
n2, O( n2 )
También conocido como HeapSort Un montículo se define como:
Para todo nodo del árbol se debe cumplir que su valor sea mayor o igual que el valor de cualquiera de sus hijos
La idea central de este método se basa en dos operaciones: Construir un montículo Eliminar la raíz del montículo en forma repetida
Ordenación por montículo
Para representar un montículo en un arreglo se debe tener en cuenta para todo nodo K lo siguiente: El nodo K se almacena en la posición K correspondiente
del arreglo El hijo izquierdo del nodo K se almacena en la posición
2 * K El hijo derecho del nodo K se almacena en la posición
2 * K +1 En la siguiente diapositiva se representa un montículo
en un arreglo unidimensional
Ordenación por montículo
Ordenación por montículo
67
36
28 21
27 16 15 08
60
56 44
35
67 36 60 28 21 56 44 27 16 15 08 351 2 3 4 5 6 7 8 9 10 11 12
Inserción de un elemento en un Montículo
La inserción en un montículo se lleva a cabo de la siguiente manera: Se inserta en la primera posición disponible. Se verifica si el valor es mayor que el de su padre.
Si se cumple se efectúa el intercambio. Si no se cumple entonces el algoritmo se detiene y el elemento
queda ubicado en su posición correcta. Es un algoritmo recursivo y desde abajo hacia arriba.
Por ejemplo insertaremos los siguientes elementos en un montículo que esta vacío:
15, 60, 08, 16, 44, 27, 12, 35
Inserción por Montículo
Inserción: 15 15 15
60
15
15
60
15 6060 15
15
60
08
16
16
60
08
15
60 15 08 16
60 16 08 15Inserción: 08 y 16
Inserción: 60
15 60 08 16 44 27 12 35
1 2 3 4 5 6 7 8
Inserción por Montículo
Inserción: 44
16
60
08
15 44
44
60
08
15 16
60 16 08 15 44 60 44 08 15 16
44
60
08
15 16 27
44
60
27
15 16 08
60 44 08 15 16 27 60 44 27 15 16 08
Inserción: 27
Inserción por Montículo
Inserción de 12 y 35
44
60
27
15 16 08 12
35
44
60
27
35 16 08 12
15
60 44 27 15 16 08 12 35
60 44 27 35 16 08 12 15
Eliminación de un Montículo
Se elimina la raíz del montículo en forma repetida. Se reemplaza la raíz con el elemento que ocupa la última
posición del montículo. Verifica que la nueva raíz sea menor que el valor más
grande de sus hijos. Si se cumple la condición, entonces se efectúa el
intercambio. Si no se cumple el algoritmo se detiene
Se aplica este algoritmo de manera recursiva y de arriba hacia abajo.
Ejemplo: Se desea eliminar la raíz del montículo presentado en el arreglo, en forma repetida:
60 44 27 35 16 08 12 15
Eliminación de un Montículo
Eliminación de la raíz: 60 Intercambiamos la raíz 60 con el elemento que ocupa la última
posición del montículo que es 15.
15 44 27 35 16 08 12 60
44 15 27 35 16 08 12 60
44 35 27 15 16 08 12 60
La nueva raíz es: 15 y comparamos: i. Vector[1] < Vector[2] (15 < 44) si hay intercambio ii. Vector[1] < Vector[3] (15 < 27)
El nuevo valor de la posición 2 es 15 y comparamos: i. Vector[2] < Vector[4] (15 < 35) sí hay intercambio ii. Vector[2] < Vector[5] (15 < 16)
Eliminación de un Montículo
Eliminación de la raíz: 44 Intercambiamos la raíz 44 con el elemento que ocupa la última
posición del montículo que es 12
12 35 27 15 16 08 44 60
35 12 27 15 16 08 44 60
35 16 27 15 12 08 44 60
La nueva raíz es 12 y comparamos: i. Vector[1] < Vector[2] (12 < 35) si hay intercambioii. Vector[1] < Vector[3] (12 < 27)
El nuevo valor de la posición 2 es 12 y comparamos: i. Vector[2] < Vector[4] (12 < 15)ii. Vector[2] < Vector[5] (12 < 16) si hay intercambio
Eliminación de un Montículo
Eliminación de la raíz 35 Intercambiamos la raíz 35 con el elemento que ocupa la última
posición del montículo que es 08.
08 16 27 15 12 35 44 60
27 16 08 15 12 35 44 60
La nueva raíz es: 08 y comparamos: i. Vector[1] < Vector[2] (08 < 16)ii. Vector[1] < Vector[3] (08 < 27) si hay intercambio
Eliminación de un Montículo
Eliminación de la raíz 27 Intercambiamos la raíz 27 con el elemento que ocupa la última
posición del montículo que es 12.
12 16 08 15 27 35 44 60
16 12 08 15 27 35 44 60
16 15 08 12 27 35 44 60
La nueva raíz es 12 y comparamos:i. Vector[1] < Vector[2] (12 < 16) si hay intercambioii. Vector[1] < Vector[3] (12 < 08)
El nuevo valor de la posición 2 es: 12 y comparamos:i. Vector[2] < Vector[4] (12 < 15) si hay intercambio
Eliminación de un Montículo
Eliminación de la raíz: 16 Intercambiamos la raíz 16 con el elemento que ocupa la última
posición del montículo que es 12.
12 15 08 16 27 35 44 60
15 12 08 16 27 35 44 60
La nueva raíz es: 12 y comparamos:i. Vector[1] < Vector[2] (12 < 15) si hay intercambioii. Vector[1] < Vector[3] (12 < 08)
Eliminación de un Montículo
Eliminación de la raíz: 15 Intercambiamos la raíz 15 con el elemento que ocupa la última
posición del montículo que es 08.
08 12 15 16 27 35 44 60
12 08 15 16 27 35 44 60
La nueva raíz es: 08 y comparamos: i. Vector[1] < Vector[2] (08 < 12) si hay intercambio
Eliminación de un Montículo
Eliminación de la raíz 12 Intercambiamos la raíz 12 con el elemento que ocupa la
última posición del montículo que es 08.
08 12 15 16 27 35 44 60
El nuevo valor de la posición 1 es: 08 y no podemos comparar con más pues el primer hijo del montículo no existe. Pero observamos que el séptimo mayor valor
Análisis de eficiencia del método del Montículo
El análisis del método del montículo es complejo. Debemos tener en cuenta tanto la fase de construcción del
montículo como la fase de eliminación de su raíz. Este es un método muy rápido para sobre todo para
valores grandes de n. El tiempo de ejecución del algoritmo en ambas fases es
O(n * log n)
Métodos de Búsqueda
Introducción
La búsqueda es una operación que nos permite recuperar información previamente almacenada. El resultado de la operación es el éxito en el caso de
encontrar el elemento buscado y de fracaso en caso contrario.
Ejemplos: Directorios de archivos ordenados. Ofertas laborales ordenados por tipo de trabajo. Libros de la biblioteca ordenados por autor y tema.
Se puede realizar sobre elementos ordenados ó sobre elementos desordenados.
Clasificación de los métodos de búsqueda
Se pueden clasificar en:
Búsqueda Interna: Cuando los elementos se encuentran en memoria principal.
Búsqueda externa: Cuando todos los elementos se encuentran en memoria secundaria
Métodos de Búsqueda Interna
Estos pueden ser almacenados en estructuras estáticas como arreglos y estructuras dinámicas como listas enlazadas y árboles. Búsqueda Secuencial ó lineal Búsqueda Secuencial con Bloques Búsqueda con Índices. Búsqueda Binaria. Búsqueda por transformación de clave (hash). Árboles Binarios de Búsqueda.
Búsqueda Secuencial
Consiste en revisar elemento tras elemento de la estructura de datos. Hasta encontrar el dato más buscado o Hasta llegar al final de la lista de datos disponibles.
Se puede realizar una búsqueda secuencial en: Un arreglo desordenado. Un arreglo ordenado Una Lista enlazada desordenada Una Lista enlazada ordenada
Análisis de la eficiencia de la Búsqueda Secuencial
El número de comparaciones es uno de los factores que se utilizan para determinar los la complejidad de los métodos de búsqueda
En cada método debemos evaluar situaciones donde se presenten el Caso peor Caso medio Caso mejor
Análisis de la Búsqueda Secuencial en Arreglo Desordenado
La operación elemental seleccionada es la comparación.
Caso Mejor: El elemento buscado está en la primera posición.
Cmín = 1
Caso Peor: El elemento buscado no se encuentra en el arreglo o está al final.
Cmáx= n Caso Medio: El elemento buscado se encuentra en
una posición i en el arreglo.
Cmedio= (n + 1) / 2
Análisis de la Búsqueda Secuencial en Arreglo Desordenado (Caso Medio)
Misma probabilidad de la distribución de los datos. Misma probabilidad de encontrar al elemento buscado en
cualquier posición del arreglo. El número de comparaciones puede ser 1, 2, 3, ..., n y en
cada paso debe darse una probabilidad de 1/n
2
11
2
1
1...321
1...
13
12
11
n
n
nnC
nnC
nn
nnnC
medio
medio
medio
Análisis de la Búsqueda Secuencial en Listas Enlazadas
El número de comparaciones en la búsqueda secuencial en listas simplemente enlazadas es el mismo que para arreglos.
Búsqueda Secuencial usando Bloques
El vector debe estar ordenado para este método. Trabajar con bloque de elementos en vez de
elementos aislados. El tamaño del bloque de elementos depende del
número de elementos del vector. Se realiza comparando la clave con el último
elemento de cada bloque. Si la clave resulta menor, se busca secuencialmente
en los elementos salteados del bloque de elementos.
Análisis de la Búsqueda Secuencial usando Bloques
La operación elemental seleccionada es la comparación. Caso Mejor: El elemento buscado se encuentre en el
último elemento del primer bloque.
Caso Mejor = 1 Caso Peor: El elemento buscado se encuentre en la
penúltima posición del último bloque y donde todos los bloque sean del mismo tamaño. En el caso de que el último bloque no sea del mismo
tamaño que el resto, estaría dado por el penúltimo elemento del penúltimo bloque.
Caso Peor = N/(N)1/2 +((N)1/2 -1) = 2N/(N)1/2 – 1
Análisis de la Búsqueda Secuencial usando Bloques
Caso Medio: El elemento buscado se encuentra en una posición i en el arreglo.
Caso Medio = [ 2N/(N)1/2 – 1 + 1 ]/2 = 2N/(N)1/2
Búsqueda Binaria
Se efectúa sobre arreglos más no sobre listas. Los datos previamente deben estar ordenados. Consiste en comparar el valor buscado con el
elemento medio y discriminar si se encuentra en medio, la mitad superior ó la mitad inferior.
Para luego proseguir con esta misma táctica en el bloque definido anteriormente.
Análisis de la Búsqueda Binaria
La operación elemental seleccionada es la comparación.
Caso Mejor: El elemento buscado está en la posición del medio de la lista.
Cmín = 1
Caso Peor: El elemento buscado no se encuentra en el arreglo. El problema consiste en que no se sabe a priori cuantas
comparaciones van a realizarse. Habrá tantas comparaciones como elementos medios
haya.
Cmáx = log2(N)
Análisis de la Búsqueda Binaria
Caso medio: El elemento buscado se encuentra en una posición aleatoria.
2
)(log1 2 NCmedio
Árboles Binario de Búsqueda
Árbol de búsqueda es si el valor contenido en cada nodo Es menor que los valores del subárbol derecho Es mayor o igual que los valores del subárbol
izquierdo. Esta estructura permite buscar valores en forma más
eficiente.
3
52
1 4 6
Búsqueda de Árboles Binarios de Búsqueda
El proceso consiste en buscar el VALOR.
1. Si VALOR < N hijo izquierdo de N
2. Si VALOR > N hijo derecho de N
3. Repetir el paso (1) y (2) hasta que las siguientes condiciones:
Si VALOR = N puntero al nodo encontrado.
Si hay un subárbol vació La búsqueda ha sido infructuosa
38
14 56
8 23 82
1970
45
Inserción de Árboles Binarios de Búsqueda
El proceso consiste en insertar el VALOR. Si VALOR < N el hijo izquierdo de
N. Si VALOR > N el hijo derecho de
N. Si VALOR = N y existe hijo izquierdo el hijo izquierdo de N.
Repetir el paso (1) , (2) y (3) hasta que las siguientes condiciones: Si hay un subárbol vació Se
inserta en el subárbol vacío.
38
14 56
8 23 82
1970
45
Eliminación de Árboles Binarios de Búsqueda
El proceso consiste es eliminar el VALOR.
Caso 1: N no tiene hijos N se elimina y se remplaza el puntero del padre a N por el puntero nulo.
Caso2: N tiene un hijo N se elimina y es reemplazando el puntero a N del Padre por puntero al hijo único de N
Caso 3: N tiene dos hijos, N se elimina y es remplazado por el nodo que está más a la derecha en el subárbol izquierdo.
38
14 56
8 23 82
1970
45
Análisis de operaciones en Árboles Binarios de Búsqueda
Muchos nodos pueden tener un solo hijo y así sus ramas se vuelven largas y delgadas, con esto se vuelve ineficiente. El peor caso todos los nodos pueden tener un solo hijo.
Buscar un valor en el significa comparar prácticamente con los n nodos del árbol.
Existen métodos para equilibrar el árbol y que las operaciones de búsqueda, adición, ó borrado requieran un tiempo que este en O(Log n) en el caso peor