Está en la página 1de 41

ESTRUCTURA DE DATOS

“Dime y lo olvido,
enséñame y lo recuerdo,
involúcrame y lo
aprendo”.

Benjamín Franklin
ED-2014-224
Tema
Métodos de
Ordenamiento y
4.1 Métodos de ordenamiento.
Búsqueda
Algoritmos de ordenamiento interno
y externo: burbuja, quicksort,
shellsort, intercalación, mezcla
natural, mezcla directa.

4.2 Métodos de búsqueda.


Secuencial, Binaria, Hash.

ED-2014-224
Tema
Métodos de
Ordenamiento y
Búsqueda
Conoce, comprende y
aplica los algoritmos de
Ordenamiento y búsqueda,
para el uso adecuado en el
desarrollo de aplicaciones
que permita solucionar
problemas del entorno.

ED-2014-224
ALGORITMOS DE ORDENAMIENTO

ED-2014-224
Clasificación de los Métodos de Ordenamiento

• Ordenamiento Interno
▪ Son algoritmos que realizan el ordenamiento a datos
almacenados en la memoria principal.

• Ordenamiento Externo
▪ Son algoritmos que realizan el ordenamiento a
datos almacenados en la memoria secundaria.

ED/EOD-2010
4.1. Burbuja (Clasificación por intercambio directo)
• Análisis
– La idea básica de este algoritmo consiste en comparar
pares de elementos adyacentes e intercambiarlos entre sí
hasta que todos se encuentran ordenados.
– Se realizan (n-1) pasadas, transportando en cada una de
las mismas el menor o mayor elemento (según sea el caso)
a su posición ideal.
– Al final de las (n-1) pasadas los elementos del arreglo
estarán ordenados.
• Ej. A: 15 67 08 16 44 27 12 35

ED/EOD-2010
4.1. Burbuja (Clasificación por intercambio directo)
• Algoritmo
1.Repetir con i<-1 hasta N-1
1.1.Repetir j<- 0 hasta (N-i)-1
1.1.1.Si A[ j ]> A[ j+1 ] entonces
Hacer aux <- A[ j ],
A[ j ]<-A[ j +1] y A[ j+1 ]<-aux
1.1.2.{fin 1.1.1.}
++j
1.2. {fin 1.1.}
++i
2.{fin 1}
ED/EOD-2010
• Algoritmo Mejorado
1. Hacer i<-1 y ban<-f
2. Repetir mientras (i<=N-1) y (ban = f)
Hacer ban<-v
2.1.Repetir j<- 0 hasta (N-i)-1
2.1.1.Si A[ j ]> A[ j+1 ] entonces
Hacer aux <- A[ j ],A[ j ]<-A[ j +1],
A[ j+1 ]<-aux y ban<-f
2.1.2.{fin 2.1.1.}
Hacer j<-j+1
2.2. {fin 2.1.}
Hacer i<-i+1
3.{fin 2}

ED/EOD-2010
4.3 Intercalación directa (Merge)
• Fue desarrollado en 1945 por John Von
Neumann.
• Algoritmo:
1. Dividir en dos partes iguales (A, B) el vector o
archivo a ordenar (C).
2. Ordenar por separado cada una de las partes.
3. Mezclar ambas partes, manteniendo el
orden, en un sólo vector ordenado.
ED/EOD-2010
4.3 Intercalación directa (Merge)…
Algoritmo Merge 4. Si NA >=R entonces
1. NA  0, NB  0, P  0 4.1 Para K  0 a (S – NB)-1
2. Mientras NA < R y NB < S C[P+K]  B[NB + K]
++K
2.1 Si A[NA] < B[NB] entonces 4.2 {Fin 4.1}
C[P]  A[NA] de lo contrario
++ NA 4.3 Para K  0 a (R – NA)-1
de lo contrario C[P+K]  A[NA + K]
C[P]  B[NB] ++K
4.4 {Fin 4.3}
++ NB 5. {Fin 4}
2.2 {Fin 2.1}
++ P
3. {Fin 2}

ED/EOD-2010
4.2. Quick Sort (Clasificación por partición)
• Análisis 5. Repetir desde el paso 2) mientras
Este algoritmo es uno de los no se crucen los índices izquierdo y
mejores que se conocen derecho.
actualmente. Es una mejora del 6. Intercambiar x con el elemento de
método de ordenación por la derecha.
intercambio directo y consiste en: 7. En este momento el elemento x
1) Elegir un elemento x al azar divide el arreglo en dos subarreglos
2) Buscar por la izquierda del arreglo tales que el subarreglo izquierdo
un elemento mayor que x. contiene los elementos <= que x y
el subarreglo derecho > que x, por
3) Buscar por la derecha un elemento lo tanto x esta ordenado.
menor o igual que x.
8. Hacer quicksort con el arreglo
4) Si no se han cruzado los índices izquierdo.
izquierda y derecha intercambiar
el elemento mayor. 9. Hacer quicksort con el arreglo
derecho.

ED/EOD-2010
4.2. Quick Sort (Clasificación por partición)
Recursivo (I, F) 2.3.3. Si P!=izq entonces
1.izq<- I, der<-F, P<-I, ban<-v ban<-v, aux<-A[P],
2.Repetir mientras (ban=v)
A[P]<-A[izq], A[izq]<-aux y
ban<-f
P<-izq
2.1.Repetir mientras(A[P]<=A[der])
y (P!=der) 2.3.4.{fin 2.3.3.}
der<-der-1 2.4.{fin 2.3.}
2.2.{fin 2.1.} 3.{fin 2}
2.3.Si P!=der entonces 4.Si (P-1)>I entonces
aux<-A[P], A[P]<-A[der], Recursivo(I, P-1)
A[der]<-aux y P<-der 5.{fin 4}
2.3.1.Repetir 6.Si F>(P+1) entonces
mientras(A[P]>=A[izq])y (P!=izq)
izq<-izq+1 Recursivo(P+1, F)
2.3.2.{fin 2.3.1.} 7.{fin 6}
Estructura de Datos
4.5 Shellsort (Inserción por incrementos decrecientes)
• Creado por Donald L. Shell en 1959.
• Análisis
– En éste método cada elemento se compara para su ubicación
correcta en el arreglo, con los elementos que se encuentran en
la parte izquierda del mismo.
– Si el elemento a insertar es más pequeño que el grupo de
elementos que se encuentran a su izquierda, es necesario
efectuar entonces varias comparaciones antes de su ubicación
– Shell propone que las comparaciones entre elementos se
efectúan con saltos de mayor tamaño pero con incrementos
decrecientes, así, los elementos quedarán ordenados en el
arreglo más rápidamente.

• Ej. A: 15 67 08 16 44 27 12 35
ED/EOD-2010
4.5 Shellsort (Inserción por incrementos decrecientes)
• Algoritmo
1.Hacer x<- N-1
2.Repetir mientras (x>1)
Hacer x<-ent(x/2) y ban<-v
2.1.Repetir mientras(ban = v)
Hacer ban<-f, i<-0
2.1.1.Repetir mientras((i+x) < N)
2.1.1.1.Si A[ i ]>A[i+x] entonces
Hacer aux<-A[ i ], A[i]<-A[i+x],
A[i+x]<-aux y ban<-v
2.1.1.2.{fin 2.1.1.1.}
Hacer i<-i+1
2.1.2.{fin 2.1.1.}
2.2.{fin 2.1.}
3.{fin 2.}
4.4 Mezcla natural (o equilibrada)
• Es una mejora del algoritmo de mezcla directa
puesto que en vez de considerar tramos de
tamaño fijo se toman en cuenta para la
ordenación en todo momento tramos de
longitud máxima.
• Al igual que mezcla directa se debe hacer un
proceso de partir el archivo o arreglo original
para mezclarlo, posteriormente mientras en el
archivo A haya elementos a mezclar.

ED/EOD-2010
4.4 Mezcla natural (o equilibrada)…
Ejemplo
A: 3, 1, 2, 4, 6, 9, 5, 8, 10, 7
1. Se separan todos los tramos
ordenados de la estructura:
A: [3], [1, 2, 4, 6, 9], [ 5, 8, 10], [7]

2. La primera pasada separará los


tramos alternándolos en dos Aux1: [3], [ 5, 8, 10]
estructuras auxiliares:
Aux2: [ 1, 2, 4, 6, 9], [7]
3. Se mezclan ambos tramos en una
sola estructura:
A: [1, 2, 3, 4, 6, 9], [ 5, 7, 8, 10]
4. Se repite el proceso separando los
tramos ordenados en estructuras Aux1: [1, 2, 3, 4, 6, 9]
auxiliares:
Aux2: [ 5, 7, 8, 10]
5. Se mezclan ambos tramos y se
obtiene la estructura ordenada: A: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Estructura de Datos
PRÁCTICA #1: Implementación de los métodos de
ordenamiento
• Construye una aplicación en java en la que permitas que el
usuario ingrese diversos datos y los ordene por cualquiera de los
métodos de ordenamiento vistos en clase que seleccione de un
menú. Crea una plantilla que contenga los métodos de
ordenamiento estudiados para que la aplicación o proyecto la
utilice.
OFERTA:

Presenta tu propio algoritmo de mezcla


equilibrada y obtén 10 pts. EXTRA en tu
calificación parcial de ésta Unidad IV.
.
MÉTODOS DE BÚSQUEDA

Estructura de Datos
4.6 Búsqueda Secuencial o lineal
• Descripción
– Consiste en localizar un registro (elemento) con un valor
de llave particular.
• Análisis
– Empezar del inicio de la lista e ir a través de cada registro
hasta encontrar la llave indicada (K) o hasta el final de la
lista.
– La búsqueda termina exitosamente cuando se localiza el
registro que contenga la llave buscada o cuando se alcanza
el final del archivo.
• Éste método es aplicable a cualquier estructura de datos.
. Estructura de Datos
4.6 Búsqueda Secuencial o lineal…
Algoritmo de Búsqueda Secuencial Desordenada
1.Hacer ban <- f, i<-0
2. Repetir mientras (i<N) y (ban=f)
2.1. Si A[i] = K entonces
Imprimir “el elemento si está en el arreglo”
y hacer ban<-v
2.2. {fin 2.1.}
i<-i+1
3. {fin 2.}
4. Si ban = f entonces
Imprimir “el elemento no está en el arreglo”
5. {fin 6.}
Estructura de Datos
Algoritmo de Búsqueda Secuencial Ordenada
1.Hacer ban <- f, i<-0
2. Si K = A[N-1] entonces imprimir “si existe”
De lo contrario
Si K > A[N-1] entonces imprimir “no existe”
De lo contrario
3. Repetir mientras (i<N) y (ban=f)
2.1. Si A[i] >= K entonces
hacer ban<-v
de lo contario
i<-i+1
2.2. {fin 2.1.}
3. {fin 2.}
4. Si A[i] = K entonces
Imprimir “el elemento si está en el arreglo”
de lo contrario
Imprimir “el elemento no está en el arreglo”
5. {fin 6.}
Estructura de Datos
4.7 Búsqueda Binaria
Consiste en dividir el intervalo de búsqueda en dos partes.
Análisis
◼ Se divide la estructura en dos partes ( cen= N/2).

◼ Se compara el elemento buscado con el de la posición central.

◼ En caso de no ser iguales se redefinan los extremos del


intervalo (según el elemento central sea mayor o menor que
el buscado) disminuyendo el espacio de búsqueda.
◼ El proceso concluye cuando el elemento es encontrado o bien
cuando el intervalo de búsqueda sea nulo.
◼ Éste método funciona únicamente para estructuras
ordenadas.
◼ Con cada iteración del método el espacio de búsqueda se
reduce a la mitad, por lo tanto el número comparaciones a
realizar disminuye notablemente, lo cual resulta significativo
cuanto más grande sea el tamaño de la estructura.
4.7 Búsqueda Binaria…
Algoritmo 2.2.{fin 2.1.}
1.Hacer izq<-0, der<-N-1 y ban<-f 3.{fin 2.}
1.Repetir mientras(izq<=der)y(ban=f) 4. Si ban = v entonces
cen<-ent(((izq+der)+1)/2) Impr. “El elemento esta en la
2.1.Si X =V[cen] entonces posición” cen +1
ban<-v de lo contrario
Impr. “El elemento no esta en
de lo contrario
el arreglo”
2.1.1.Si X>V[cen] entonces izq<-cen+1 5.{fin 4.}
de lo contrario
der<-cen-1
2.1.1.{fin 2.1.1.}

Estructura de Datos
4.8 Búsqueda Hash (Por conversión de claves)
• Descripción: Consiste en aplicar una
función que traduce un conjunto de
posibles valores clave en un rango de
direcciones o claves relativas
• Colisión: se presenta cuando a diferentes
claves les corresponde una misma dirección
o clave relativa.

Estructura de Datos
4.8 Búsqueda Hash (Por conversión de claves)
Funciones Hash
• Son los diferentes cálculos que se realizan para obtener
una dirección relativa a partir de una clave.
• Módulo
H(K)=(K mod N)+1
donde N es el número de elementos del arreglo y K es la clave del dato a buscar

EJEMPLO: N=100 K1=7259 K2=9359


H(K1)= (7259 mod 100)+1= 60
H(K2)= (9359 mod 100)+1= 60
COLISIÓN!!!
SOLUCIÓN: Se recomienda que el divisor sea el número primo más cercano
menor a N, en este caso: 97
H(K1)= (7259 mod 97)+1= 82 H(K2)= (9359 mod 97)+1= 48
4.8 Búsqueda Hash (Por conversión de claves)…
• Cuadrado
H(K)=dig_cent(K2)+1
El número de dígitos a tomar queda determinado por el rango del índice (1 .. N).

EJEMPLO: N=100 K1=7259 K2=9359


H(K12)= (52 693 081)+1= 94 H(K22)= (87 590 881)+1= 91

• Plegamiento
H(K)=dig_mens_sig((d1..di)*+(di+1..dj)*+... *+(d1..dn)+1

EJEMPLO: N=100 K1=7259 K2=9359


H(K1)= (72+59)+1= 132 H(K2)= (93+59)+1= 153
4.8 Búsqueda Hash (Por conversión de claves)…
• Truncamiento
H(K)= elegirdig(d1, d2 ..dn)+1

EJEMPLO: N=100 K1=7259 K2=9359


H(K1)= (7 2 5 9)+1= 76
H(K2)= (9 3 5 9)+1= 96

. Estructura de Datos
4.8 Búsqueda Hash (Por conversión de claves)…
Solución de colisiones
Reasignación
Principio de comparación y reasignación.
◼ Prueba Lineal:
Análisis
 Una vez detectada la colisión se debe recorrer el
arreglo secuencialmente a partir del punto de colisión.
 El proceso de búsqueda concluye cuando el elemento
es hallado o bien cuando se encuentra una posición
vacía.
 El arreglo se encuentra una estructura circular.
Estructura de Datos
4.8 Búsqueda Hash (Por conversión de claves)…
Algoritmo 2.1.1.Si Dx = N+1 entonces
1.D<-H(K) //genera dirección Dx<-1
2.Si V[D]=K entonces 2.1.2.{fin 2.1.1.}
Impr. “El elemento está en la 2.2.{fin 2.1.1.}
posición D” 2.3.Si V[Dx] = K entonces
De lo contrario Impr. “El elemento está en
la posición Dx”
Dx<-D+1
De lo contrario
2.1.Repetir mientras Impr. “El elemento no existe”
(Dx<=N)y(V[Dx]=!vacío) y
2.4.{fin 2.3.}
(V[Dx]!=K) y (Dx!=D)
3.{fin 2.}
Dx<-Dx + 1

Estructura de Datos
4.8 Búsqueda Hash (Por conversión de claves)…
Prueba cuadrática De lo contrario
Análisis I<-1 y Dx<-D+I2
 Similar al método de prueba 2.1.Repetir mientras
(V[Dx]!=K)y(V[Dx]!=vacío)
lineal la diferencia es que las
direcciones alternativas se ++I y Dx<-D + I2
generan como D+1, D+4, 2.1.1.Si Dx > N entonces
D+9,...,D+i2 en vez de D+1, I<-0, Dx<-1 y D<-1
D+2,...,D+i; 2.1.2.{fin 2.1.1.}
 Esto permite una mejor 2.2.{fin 2.1.}
distribución de claves 2.3.Si V[Dx]=K entonces
colisionadas. Impr. “El elemento está en la
Algoritmo posición Dx”
1.D<-H(K) De lo contrario
2.Si V[D]=K entonces Impr. “El elemento no está
en el arreglo”
Impr. “El elemento está en la 2.4.{fin 2.3.}
posición D”
3.{fin 2.}
4.8 Búsqueda Hash (Por conversión de claves)…
Doble dirección Hash Algoritmo
1.D<-H(K)
Análisis 2.Si V[D]=K entonces
◼ Detectada la colisión se Impr. “El elemento está en la
debe generar otra posición D”
dirección aplicando la De lo contrario Dx<-H(D)
función hash a la 2.1.Repetir mientras
dirección previamente (Dx<=N)y(V[Dx]!=K)y
obtenida. (V[Dx]!=vacío) y (Dx!=D)
◼ El proceso se detiene Dx<- H’(D)
cuando el elemento es 2.2.{fin 2.1.}
hallado o bien cuando se 2.3.Si V[Dx]=K entonces
encuentra una posición Impr. “El elemento está en
vacía. la posición Dx”
◼ La función hash que se
De lo contrario
aplique puede ser o no la Impr. “El elemento no está
en el arreglo”
misma que originalmente
2.4.{fin 2.3.}
se aplicó a la clave.
3.{fin 2.}
4.8 Búsqueda Hash (Por conversión de claves)…
Arreglos anidados
Análisis
◼ Cada elemento del arreglo tenga otro arreglo en el
cual se almacenen los elementos colisionados.
◼ Resulta una solución sencilla pero ineficiente
debido a que la estructura utilizada (arreglo) es de
tipo estática.

Estructura de Datos
4.8 Búsqueda Hash (Por conversión de claves)…
Encadenamiento
Análisis
◼ Cada elemento del arreglo tenga un apuntador a una
lista ligada, la cual se irá generando e irá almacenando
los valores colisionados a medida que se requiera.
◼ Es el método más eficiente de solución de colisiones
debido al dinamismo de la lista.
◼ Desventaja:
◼ Se ocupa espacio adicional al de la tabla
◼ Si las listas crecen demasiado se perderá la facilidad
de acceso directo del método hash.

Estructura de Datos
4.8 Búsqueda Hash (Por conversión de claves)…
Algoritmo
1.D<-H(K)
2.Si V[D].cve=K entonces
Impr. “El elemento está en la
posición D”
De lo contrario Q<-V[D].sig
2.1.Repetir mientras (Q!=NULL)y(Q.cve!=K)
Q<- Q.sig
2.2.{fin 2.1.}
2.3.Si Q=NULL entonces
Impr. “El elemento no está en la lista”
De lo contrario
Impr. “El elemento está en la lista”
2.4.{fin 2.3.}
3.{fin 2.}
PRÁCTICA #2: Implementación de los métodos de
búsqueda
• Construye una aplicación en java en la que permitas que el usuario, a
partir de un conjunto de datos dados, realice la búsqueda de un valor
por cualquiera de los métodos de búsqueda vistos en clase que
seleccione de un menú. Crea una plantilla que contenga los métodos
de búsqueda estudiados para que la aplicación o proyecto la utilice.

OFERTA:

Elabora INDIVIDUALMENTE una aplicación con Hash, utilizando 2


funciones y 2 métodos de solución de colisiones (excepto
arreglos anidados) y obtendrás 10 pts. ADICIONALES en la
Calificación parcial de ésta Unidad IV.
Estructura de Datos
CONCLUSIONES
• La eficiencia de una función Hash depende de:
1. La distribución de los valores de llave que realmente
se usan.
2. El número de valor de llave que realmente están en
uso con respecto al tamaño del espacio de
direcciones.
3. El número de registros que pueden almacenarse en
una dirección dada sin causar una colisión.
4. La técnica usada para resolver el problema de las
colisiones.

Estructura de Datos
CONCLUSIONES…
• Ventajas:
1. Se pueden utilizar valores naturales de la llave,
ya que se traducen internamente a direcciones
fáciles de localizar.
2. Se logra independencia física y lógica, debido a
que los valores de las llaves son independientes
del espacio de direcciones.
3. No requiere almacenamiento adicional para los
índices.

Estructura de Datos
CONCLUSIONES…
• Desventajas:
1. No pueden usarse registros de longitud
variable.
2. El archivo no está clasificado.
3. No permite llaves repetidas.
4. Sólo permite acceso por una sola llave.

Estructura de Datos
CONCLUSIONES…

• COSTOS
1.Tiempo de procesamiento requerido
para aplicar la función hash.
2. Tiempo de procesamiento y los
accesos E/S requiere para solucionar
colisiones.

Estructura de Datos
Ejercicios Hash:
1. Sea V un arreglo de 10 elementos, obtén las direcciones relativas de las
siguientes claves aplicando las funciones hash vistas: 72, 34, 96, 79, 94,
19, 88, 63, 38, 46. Solucionar colisiones con prueba lineal.
2. Considera un arreglo V con 100 elementos, obtén las direcciones
relativas de las siguientes claves aplicando las funciones hash vistas:
5699, 7060, 4465, 1349, 1515, 3273, 5107, 1435, 6418, 2567.*
Solucionar colisiones con prueba cuadrática.
3. Calcula las direcciones alternativas de las siguientes claves mediante las
funciones hash, para un arreglo V con 20 elementos: 181, 112, 45, 136,
146, 143, 95, 155, 134, 33, 125, 155, 68, 187, 71.** Solucionar colisiones
con doble dirección hash.

*para plegamiento sumar y para truncamiento millares y decenas.


**para plegamiento sumar y para truncamiento decenas.

Estructura de Datos
ESTRUCTURA DE DATOS

“Si piensas que tu profesor es


duro, espera a que tengas un
jefe. Ese sí que no tendrá
vocación de enseñanza ni la
paciencia requerida”.
Bill Gates

ED/EOD-2010

También podría gustarte