Anda di halaman 1dari 77

ALGORITMICA III

Algoritmos de Bsqueda
Docente: Carlos A. Ruiz De La Cruz Melo
Correo: zorroculto69@hotmail.com
Los algoritmos de bsqueda tienen como
finalidad localizar un elemento dado
dentro de una estructura de datos o
determinar su inexistencia.

Naturalmente, la bsqueda ser mucho
ms eficiente si la estructura de datos (en
nuestro caso el vector) est ordenada.

As, los algoritmos que estudiaremos
servirn para realizar bsquedas en
vectores ordenados.
INSTRODUCCION
A lo largo de esta leccin estudiaremos los
siguientes algoritmos de bsqueda:

Bsqueda secuencial.
Bsqueda secuencial con centinela.
Bsqueda binaria (o dicotmica)
Bsqueda indexada
Bsqueda por interpolacin.

Se presentar pseudocdigo y anlisis de la
complejidad para cada uno de los algoritmos.
ALGORITMOS DE
BUSQUEDA
El algoritmo de bsqueda ms sencillo
recorre el vector desde el primer elemento
hasta el ltimo y si encuentra el valor
buscado retorna su posicin o avisa que lo
encontro.

Obviamente, se trata del nico algoritmo
posible si el vector no est ordenado.

Sin embargo, si el vector est ordenado
resulta muy ineficiente.
BUSQUEDA
SECUENCIAL
BUSQUEDA SECUENCIAL
Funcion busquedaSecuencial(v, n, valor): lgico
entero: i, n
logico: encontro
encontrofalso
para i0 hasta n hacer
si v(i)=valor entonces
encontroverdadero
fin si
finpara
retornar encontro
finbusquedaSecuencial
Como se puede apreciar el algoritmo realiza
siempre el mismo nmero de iteraciones
independientemente de la posicin en que se
encuentre el valor buscado.

El nmero de iteraciones siempre es igual al
tamao del vector y, puesto que todas las
operaciones del interior del bucle tienen coste
unitario, la complejidad del algoritmo de
bsqueda secuencial es O(n).
El algoritmo de bsqueda
secuencial resulta muy ineficiente
puesto que no se aprovecha del
hecho de que el vector est
ordenado.

Es posible modificarlo para que,
teniendo en cuenta esa
circunstancia, finalice en cuanto
localice el elemento o se determine
que ste no existe.

Esta modificacin se conoce como
bsqueda secuencial con
centinela.
BUSQUEDA SECUENCIAL
CON CENTINELA
Funcion BusSecSentinela(v, n, valor):logico
i0
mientras v(i)<valor y i<n hacer
ii+1
finmientras
si v(i)=valor entonces
encontroverdadero
sino
encontrofalso
finsi
finBusSecSentinela
La bsqueda secuencial con
centinela no precisa recorrer el
vector por completo.

El caso mejor se produce cuando
el elemento a buscar es el primero
del vector o menor que todos los
elementos del vector. Entonces la
complejidad es O(1).

El caso peor se da cuando el
elemento a buscar es el ltimo del
vector o mayor que todos los
elementos del vector. Entonces la
complejidad es O(n).

Por trmino medio, el algoritmo
empleado es del orden de n/2
iteraciones, por lo cual la
complejidad del caso medio
tambin sera O(n).
BUSQUEDA SECUENCIAL
CON CENTINELA
Funcion BusSecSentinela(v, n, valor):logico
i0
mientras v(i)<valor y i<n hacer
ii+1
finmientras
si v(i)=valor entonces
encontroverdadero
sino
encontrofalso
finsi
finBusSecSentinela
La idea bsica de la bsqueda binaria o
dicotmica es reducir el tamao del
problema a la mitad en cada iteracin.

Cuando el tamao del problema, esto es
del vector, sea 1 se puede resolver la
bsqueda de forma directa.

La estrategia empleada por este algoritmo
es muy similar a la del juego patata
caliente...
BUSQUEDA BINARIA
El algoritmo de bsqueda
binaria divide el tamao
del vector por 2 hasta
quedarse con un vector de
tamao 1.

En el caso optimo,
requiere solo una
comparacin. Su tiempo
de ejecucin no depende
de la cantidad de datos, es
constante y por lo tanto
proporcional a 1, sea
O(1).

En el peor caso, si
depende de n. El
algoritmo realiza log (n)
divisiones y, por tanto, su
complejidad es O(log n).
BUSQUEDA BINARIA
Funcion BusquedaBinaria(v, valor): entero
posicion-1
encontradofalso
izq1
derMAX
mientras no encontrado y izq der hacer
medio(izq+der)/2
Si v(medio)=valor entonces
posicionmedio
encontradoverdadero
sino
si v(medio)>valor entonces
dermedio-1
sino
izqmedio+1
finsi
finsi
fin mientras
busquedaBinariaposicion
fin funcion
BUSQUEDA BINARIA
Funcion BusquedaBinaria(v, valor): entero
posicion-1
encontradofalso
izq1
derMAX
mientras no encontrado y izq der hacer
medio(izq+der)/2
Si v(medio)=valor entonces
posicionmedio
encontradoverdadero
sino
si v(medio)>valor entonces
dermedio-1
sino
izqmedio+1
finsi
finsi
fin mientras
busquedaBinariaposicion
fin funcion
5 10 12 20 30 40 50 60 70 80 90
1 2 3 4 5 6 7 8 9 10 11
der Izq Izq<der medio V[medio] posicin
11 1 1 <11 6 40
7 7<11 9 70
10 10<11 10 80 10
BUSQUEDA BINARIA
1 1 2 3 4 5 5 5 6 9
1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 5 5 6 9
1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 5 5 6 9
1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 5 5 6 9
1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 5 5 6 9
1 2 3 4 5 6 7 8 9 10
Funcion BusquedaBinaria(v, valor): entero
posicion-1
encontradofalso
izq1
derMAX
mientras no encontrado y izq der hacer
medio(izq+der)/2
Si v(medio)=valor entonces
posicionmedio
encontradoverdadero
sino
si v(medio)>valor entonces
dermedio-1
sino
izqmedio+1
finsi
finsi
fin mientras
busquedaBinariaposicion
fin funcion
En el vector (1,1,2,3,4,5,5,5,6,9) se va a buscar,
de forma binaria, el nmero 7
der Izq Izq<der medio V[medio] posicin
10 1 1 <10 5 4
6 6<10 8 5
9 9<10 9 6
10 10<10 10 9
El algoritmo de bsqueda
binaria divide el tamao
del vector por 2 hasta
quedarse con un vector de
tamao 1.

Al llegar al tamao unitario
se puede determinar
directamente si el
elemento buscado existe o
no.

As, el algoritmo de
bsqueda binaria realiza
log

(n) iteraciones y, por
tanto, su complejidad es
O(log n).
BUSQUEDA BINARIA
Funcion BusquedaBinaria(v, valor): entero
posicion-1
encontradofalso
izq1
derMAX
mientras no encontrado y izq der hacer
medio(izq+der)/2
Si v(medio)=valor entonces
posicionmedio
encontradoverdadero
sino
si v(medio)>valor entonces
dermedio-1
sino
izqmedio+1
finsi
finsi
fin mientras
busquedaBinariaposicion
fin funcion
BUSQUEDA BINARIA
VENTAJAS
DESVENTAJAS
Mtodo eficiente siempre que el vector est
ordenado.
La bsqueda binaria proporciona un medio para
reducir el tiempo requerido para buscar en una lista.
Es mas rpido por su recursividad, su mayor ventaja
es con los archivos extensos.
En esencia, con una sola comparacin eliminamos
la mitad de la tabla.
El arreglo debe esta ordenado y el almacenamiento
de un arreglo ordenado suele plantear problemas en
las inserciones y eliminaciones de elementos.
Requiere que todos los elementos esten ordenados
lo cual es costoso
BUSQUEDA POR
INTERPOLACION
En numerosos fenmenos de la naturaleza
observamos una cierta regularidad en la forma de
producirse, esto nos permite sacar conclusiones de
la marcha de un fenmeno en situaciones que no
hemos medido directamente.
La interpolacin consiste en hallar un dato
dentro de un intervalo en el que conocemos los
valores en los extremos.

La extrapolacin consiste en hallar un dato fuera
del intervalo conocido, pero debe tenerse en
cuenta que est prximo a uno de sus extremos,
pues en otro caso no es muy fiable el resultado
obtenido.
DEFINICION MATEMATICA DE
LA INTERPOLACION
En el subcampo matemtico del anlisis
numrico, se denomina interpolacin a la
obtencin de nuevos puntos partiendo del
conocimiento de un conjunto discreto de
puntos.

En todo caso, se trata de, a partir de n parejas
de puntos (x
k
,y
k
), obtener una funcin f que
verifique






a la que se denomina funcin interpolante de
dichos puntos. A los puntos x
k
se les llama
nodos.

n k y x f
k k
,..., 1 ) (
,
= =
Algunas formas de interpolacin que se
utilizan con frecuencia son:

La interpolacin lineal
La interpolacin polinmica (de la cual La
anterior es un caso particular)
La interpolacin por medio de spline
Interpolacin polinmica de Hermite.
ALGUNAS FORMAS DE
INTERPOLACION
Uno de los mtodos de
interpolacin ms sencillos es el
lineal. En general, en la
interpolacin lineal se utilizan
dos puntos, (x
a
,y
a
) y (x
b
,y
b
), para
obtener un tercer punto
interpolado (x,y) a partir de la
siguiente frmula:
) (
) (
) (
a b
a b
a a
x x
y y
x x y y

+ =
La interpolacin lineal es rpida y
sencilla, pero no muy precisa.
INTERPOLACION LINEAL
El algoritmo es similar al de bsqueda binaria, la
diferencia est en que en vez de dividir el rea en
mitades, se delimita por medio de los valores
resultantes de la interpolacin.

Consiste en tratar de acertar en qu parte del
intervalo est la clave que se esta buscando en lugar
de ciegamente dividir el arreglo a la mitad. Para ello
se utiliza la siguiente frmula:

BUSQUEDA POR
INTERPOLACION
]) [ ] [ (
) ( * ]) [ (
izq v der v
izq der izq v key
izq p


+ =
funcion busquedaInterpolacion (v,valor) :entero
entero: v(max), valor
entero: izq,der, presunto, busqueda
izq1
dermax
mientras ((v[der] valor) y (v[izq] < valor))
pizq+(valor-v[izq])*(der - izq) /(v[der]-v[izq])
si (valor > v[p]) entonces
izqp+1
sino
si (valor < v[p]) entonces
derp-1
sino
izqp
finsi
finsi
finmientras
si (v[izq]=valor) then
busquedaizq
sino
busqueda -1
finsi
retornar busqueda
finBusquedaDeInterpolacion
BUSQUEDA POR
INTERPOLACION
]) [ ] [ (
) ( * ]) [ (
izq v der v
izq der izq v key
izq p


+ =
BUSQUEDA POR INTERPOLACION
La bsqueda por interpolacin utiliza menos
de log log n +1 comparaciones tanto para
una bsqueda con xito como para una
bsqueda infructuosa en archivos con claves
aleatorias.

Depende fuertemente de que las claves estn
bien distribuidas en el intervalo. Esta tcnica
puede ser engaada' una distribucin no
uniforme (lo que es frecuente en la prctica).

Los clculos requeridos no merecen la pena si
n es pequeo (log n log log n ).


BUSQUEDA POR INTERPOLACION
VENTAJAS
DESVENTAJAS
La bsqueda de la interpolacin requiere una aritmtica
ms elaborada, a parte que los clculos que se necesitan
para esta bsqueda son muy lentos.
Para lograr esta bsqueda se requieren llaves,
multiplicaciones y divisiones complejas, es decir, clculos
de nivel alto.
Incluso a pesar de que el calculo es de algn modo
mas complejo, una bsqueda con interpolacin puede
proporcionar una mejora en grandes conjuntos de
datos con claves distribuidas de modo uniforme.
BUSQUEDA INDEXADA
Necesita que los elementos sobre los que
se realiza la bsqueda estn ordenados
de acuerdo a una determinada clave.

El mtodo utiliza un array auxiliar
denominado ARRAY NDICE.

Cada objeto en el ARRAY NDICE consta
de un valor y la posicin que ocupa dicho
valor en el correspondiente ARRAY
ORDENADO.

BUSQUEDA INDEXADA

1. Buscar en el array_ndice el
intervalo correspondiente al
elemento buscado.

2. Restringir la bsqueda a los
elementos del intervalo que se
localiz previamente
El mtodo consta de dos pasos:
BUSQUEDA INDEXADA
3 4 5 6 7 8 9 10 14 16 19
Se divide el ARRAY en bloques
de tres elementos

El ARRAY INDICE estar
formado por n/k+1 elementos
3 6 9 16
0 3 6 9
clave
posicin
ARRAY
ARRAY_INDICE
La bsqueda es una de las operaciones de
tratamiento de vectores ms habituales.

Una bsqueda en un vector no ordenado
tendra una complejidad O(n); por esa razn es
preferible implementar algoritmos de bsqueda
en vectores ordenados.

Hemos estudiado 5 algoritmos de bsqueda:

Bsqueda secuencial.
Bsqueda secuencial con centinela.
Bsqueda binaria.
Bsqueda indexada
Bsqueda por interpolacin.

CONCLUSIONES DE
BUSQUEDA
El primer algoritmo es el ms simple de los cuatro, recorre
completamente el vector y no precisa que el vector es ordenado;
su complejidad es O(n).

El segundo algoritmo recorre el vector hasta que se encuentra el
valor buscado o se determina que ste no existe. Su complejidad
es O(n).

El algoritmo de bsqueda binaria divide en cada iteracin el
vector en dos realizando la bsqueda en una sola de las mitades.
Su complejidad es O(log n), similar complejidad tiene la
bsqueda indexada.

La bsqueda por interpolacin es una modificacin del algoritmo
de bsqueda binaria, tambin de complejidad O(log n).
CONCLUSIONES DE
BUSQUEDA
ALGORITMICA III
Algoritmos de Clasificacin
Docente: Carlos A. Ruiz De La Cruz Melo
Correo: zorroculto69@hotmail.com
INTRODUCCIN
Sea A una lista de N elementos:

A
1
, A
2
, A
3
, ..., A
n


Se busca permutar estos elementos de tal forma que los
mismos queden de acuerdo con un orden preestablecido.

Ascendente: A
1
A
2
A
3
... A
n

Descendente: A
1
A
2
A
3
... A
n

Los mtodos de ordenacin se suelen dividir en:

Ordenamiento interno, si los elementos que han
de ser ordenados estn en la Memoria Principal.
Ordenamiento externo, si los elementos que han
de ser ordenados estn en un dispositivo de
almacenamiento auxiliar.

INTRODUCCIN
Aunque tanto el tipo y tamao de los
elementos como el dispositivo en donde se
encuentran almacenados pueden influir en
el mtodo que utilicemos para ordenarlos,
en este tema vamos a solucionar el caso en
que los elementos son nmeros enteros y se
encuentran almacenados en un vector.

Si bien existen distintos criterios para
clasificar a los algoritmos de ordenacin,
una posibilidad es atendiendo a su
eficiencia. De esta forma, en funcin de la
complejidad que presentan en el caso
medio, podemos establecer la siguiente
clasificacin:
u(n
2
): Burbuja, Insercin, Seleccin.
u(nlogn): Mezcla, Quicksort.
Otros: Shell u(n1.25).
CLASIFICACIN POR SELECCIN
Consiste bsicamente en buscar
el menor elemento del arreglo y
colocarlo al inicio.

Luego buscar el segundo
elemento ms pequeo del
arreglo y colocarlo en la segunda
posicin,

Y as hasta ubicar todos los
elementos del arreglo.

La insercin de un elemento
posterior requerir que se
muevan muchos de ellos.
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
Deseamos ordenar las siguientes claves
de arreglo:
L: 15 67 08 16 44 27 12 35
08 67 15 16 44 27 12 35
1ra. Pasada
12 15 08 16 44 27 67 35
2da. Pasada
15 44 27 67 35 12 16 08
3ra. Pasada
15 16 27 67 35 15 44 08
4ra. Pasada
15 27 16 67 35 15 44 08
5ta. Pasada
16 35 12 44 15 67 08 6ta. Pasada 27
16 44 27 12 35 15 67 08
7ma. Pasada
CLASIFICACIN POR SELECCIN
En cada paso (i=1...n1) este mtodo
busca el mnimo elemento del subvector
a[i..n] y lo intercambia con el elemento en
la posicin i:
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
CLASIFICACIN POR SELECCIN
En el caso mejor:
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
) ) 6 5 )) ( 4 3 ( 2 1 ( ( ) (
1
1

=
+ + + + + =
n
i
c c i n c c c c n t
CLASIFICACIN POR SELECCIN
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
En el caso peor
) ) 6 5 )) )( 7 4 ( 3 ( 2 1 ( ( ) (
1
1

=
+ + + + + + =
n
i
c c i n c c c c c n t
c7
CLASIFICACIN POR SELECCIN
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
En el caso medio
) ) 6 5 )) (
2
) 7 4 (
3 ( 2 1 ( ( ) (
1
1

=
+ +
+
+ + + =
n
i
c c i n
c c
c c c n t
CLASIFICACIN POR SELECCIN
El algoritmo es de complejidad
cuadrtica.

Este mtodo, por el nmero de
operaciones de comparacin e
intercambio que realiza, es el ms
adecuado para ordenar pocos
registros de gran tamao.

algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
El nmero de comparaciones
es independiente de la
disposicin inicial de los
elementos en el arreglo.

En la primera pasada se hacen
(n-1) comparaciones, en la
siguiente (n-2) y as hasta 1 en
la ltima pasada.

El nmero de movimientos
siempre ser n-1 (salvo que se
incorpore al algoritmo una
tcnica para evitar que un
elemento se intercambie
consigo mismo).
2
) 1 ( *
1 2 ... ) 2 ( ) 1 (

= + + + + =
n n
n n C
2
2
n n
C

=
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
CLASIFICACIN POR SELECCIN
Ejemplo:
Arreglo con elementos: 15 67 08 16 44 27 12 35
1ra. Pasada
08 15 67 12 16 44 27 35
12 15 08 67 16 27 44 35
2da. Pasada
15 67 27 35 44 12 16 08 3ra. Pasada
15 16 67 35 44 12 27 08 4ra. Pasada
15 27 16 67 44 12 35 08
5ta. Pasada
16 35 12 67 15 44 08 6ta. Pasada 27
16 44 27 12 35 15 67 08
7ma. Pasada
CLASIFICACIN POR INTERCAMBIO
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
CLASIFICACIN POR INTERCAMBIO
Es el mtodo ms ineficiente,
tambin llamado burbuja.

Lleva los elementos pequeos
hacia la parte izquierda del arreglo
o bienLleva los elementos ms
grandes hacia la parte derecha del
mismo.

Compara pares de elementos
adyacentes e intercambiarlos
entre s hasta que todos se
encuentren ordenados.

Por lo tanto en cada pasada se
ordenar un elemento.


algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
CLASIFICACIN POR INTERCAMBIO
En el caso mejor:
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
CLASIFICACIN POR INTERCAMBIO
En el peor caso:
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
CLASIFICACIN POR INTERCAMBIO
En el caso medio:
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
CLASIFICACIN POR INTERCAMBIO
El algoritmo es de complejidad
cuadrtica.

Este algoritmo funciona de forma
parecida al de Seleccin, pero
haciendo ms trabajo para llevar cada
elemento a su posicin.

De hecho es el peor algoritmo de
clasificacin, no slo en cuanto al
tiempo de ejecucin, sino tambin
respecto al nmero de comparaciones
y de intercambios que realiza.

Una posible mejora que puede admitir
este algoritmo es el control de la
existencia de una pasada sin
intercambios; en ese momento el
vector estar ordenado.
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
El numero de comparaciones en el
mtodo burbuja para n elementos es
la siguiente:

En la primera pasada: n-1
comparaciones
En la segunda (n-2)
comparaciones

Hasta llegar a 2 y 1 comparacin
2
) 1 ( *
1 2 ... ) 2 ( ) 1 (

= + + + + =
n n
n n C
2
2
n n
C

=
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
CLASIFICACIN POR INTERCAMBIO
Ejemplo:
Arreglo con elementos: 15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35 1ra. Pasada
15 67 08 16 44 27 12 35 2da. Pasada
16 44 27 12 35 15 67 08
3ra. Pasada
16 44 27 12 35 15 67 08 4ra. Pasada
16 44 27 12 35 15 67 08
5ta. Pasada
16 44 12 35 15 67 08 6ta. Pasada 27
16 44 27 12 35 15 67 08
7ma. Pasada
CLASIFICACIN POR INSERCIN
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
CLASIFICACIN POR INSERCIN
El mtodo de Insercin realiza
n1 iteraciones sobre el vector,
dejando en la isima etapa (2 i
n) ordenado el subvector
a[1..i].

La forma de hacerlo es
colocando en cada iteracin el
elemento a[i] en su sitio
correcto, aprovechando el hecho
de que el subvector a[1..i1] ya
ha sido previamente ordenado.

Este mtodo puede ser
implementado de forma iterativa
como sigue:
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
CLASIFICACIN POR INSERCIN
En el caso mejor el bucle interno no se
realiza nunca, y por tanto:
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
En el caso peor hay que llevar cada
elemento hasta su posicin final, con lo
que el bucle interno se realiza siempre de
i1 veces. As, en este caso:
CLASIFICACIN POR INSERCIN
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
CLASIFICACIN POR INSERCIN
En el caso medio,
supondremos equiprobable la
posicin de cada elemento dentro
del vector.

Por tanto para cada valor de i, la
probabilidad de que el elemento
se site en alguna posicin k de
las i primeras ser de 1/i.

El nmero de veces que se
repetir el bucle mientras en este
caso es (ik), con lo cual el
nmero medio de operaciones
que se realizan en el bucle es:
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
Por tanto, el tiempo de ejecucin en el caso medio es:
CLASIFICACIN POR INSERCIN
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
Para cada valor de i, la
probabilidad de que el elemento se
site en alguna posicin k de las i
primeras ser de 1/i.

El nmero de veces que se
repetir el bucle mientras en este
caso es (ik), con lo cual el
nmero medio de operaciones que
se realizan en el bucle es:
Como podemos ver, en este mtodo los
rdenes de complejidad de los casos peor,
mejor y medio difieren bastante.

As en el mejor caso el orden de
complejidad resulta ser lineal, mientras que
en los casos peor y medio su complejidad
es cuadrtica.

Este mtodo se muestra muy adecuado
para aquellas situaciones en donde
necesitamos ordenar un vector del que ya
conocemos que est casi ordenado, como
suele suceder en aquellas aplicaciones de
insercin de elementos en bancos de datos
previamente ordenados cuya ordenacin
total se realiza peridicamente.
CLASIFICACIN POR INSERCIN
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
El nmero mnimo de
comparaciones y movimientos
entre claves sucede cuando los
elementos ya est ordenados.

El nmero mximo de
comparaciones y movimientos
entre elementos se da cuando
los elementos del arreglo estn
en orden inverso.

El nmero de comparaciones
promedio se da cuando los
elementos aparecen en el
arreglo de forma aleatoria.
CLASIFICACIN POR INSERCIN
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
CLASIFICACIN POR INSERCIN

algoritmo InsercionBin(a, n)
para i=1 hasta i < n hacer
elem a[i]
bajo 0
alto (i-1)
mientras (bajo <= alto) hacer
medio (alto + bajo)/2
si ( elem< a[medio] ) entonces
alto medio -1
sino
bajo medio + 1
finsi
finmientras
j(i-1)
mientras (j >= bajo ) hacer
a[j+1] a[j]
jj-1
finmientras
a[bajo] elem
finpara
finInsercionBin

Con la bsqueda binaria se
reduce el nmero de
comparaciones desde O(n
2
)
hasta un O(nlogn).

Sin embargo, el nmero de
sustituciones requiere un
tiempo de ejecucin de O(n
2
).
Por lo tanto, el orden de
complejidad no cambia,
adems la ordenacin por
insercin se usa normalmente
slo cuando n es pequeo, y
en este caso la bsqueda
lineal es igual de eficiente que
la bsqueda binaria.
CLASIFICACIN POR SHELL
El mtodo de Shell es una
versin mejorada del mtodo de
insercin directa.

Lo propuso Donald L. Shell en
1959.

Tambin se le conoce como
clasificacin por disminucin del
incremento.

Propone que las comparaciones
entre elementos se efecten con
saltos de mayor tamao pero con
incrementos decrecientes para
que los elementos queden
ordenados ms rpidamente.
algoritmo SHELL(a, ult)
entero: i,j,h,N
N(ult-prim+1) (* numero de elementos *)
h1
REPETIR
h3*h+1
HASTA h>N (* construimos la secuencia *)
REPETIR
hh DIV 3
para ih+1 hasta N hacer
va[i]
ji
mientras (j>h) y (a[j-h+prim-1]>v) hacer
a[j+prim-1]a[j-h+prim-1]
jj-1
hh-1
finmientras
a[j+prim-1]v
finpara
HASTA h=1
finSHELL
Observacin:
se sale de REPETIR ..HASTA cuando la condicin es verdadera
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 porciones entre s
y nuevamente se les ordena por separado.

Finalmente se agrupan y ordenan de
manera normal, de uno en uno.
algoritmo SHELL(a, ult)
entero: i,j,h,N
N(ult-prim+1) (* numero de elementos *)
h1
REPETIR
h3*h+1
HASTA h>N (* construimos la secuencia *)
REPETIR
hh DIV 3
para ih+1 hasta N hacer
va[i]
ji
mientras (j>h) y (a[j-h+prim-1]>v) hacer
a[j+prim-1]a[j-h+prim-1]
jj-1
hh-1
finmientras
a[j+prim-1]v
finpara
HASTA h=1
finSHELL
CLASIFICACIN POR SHELL
CLASIFICACIN POR SHELL
4 14 21 32 18 17 26 40 6
4 14 21 32 6 17 26 40 18

4 14 6 32 21 17 26 40 18
17 21 32 26 40 18
18 40 26

4 14 6 17 21 32 18 40 26
18 32 21 40 26

4 6 14 17 18 32 21 40 26
21 32 40 26
26 40
4 6 14 17 18 21 32 26 40
26 32 40
DISTANCIA =4
DISTANCIA =2 (pasada 1)
DISTANCIA =2 (pasada 2)
DISTANCIA =1 (pasada 1)
DISTANCIA =1 (pasada 2)
4 6 14 17 18 21 32 26 40
Ej: Suponemos que se desea ordenar:
L: 15 67 08 16 44 27 12 35 56 21 13 28 60 36 07 10
15 15 67 67 08 08 16 16 44 44 27 27 12 12 35 35 56 56 21 21 13 13 28 28 60 60 36 36 07 07 10 10 1ra. Pasada: 1ra. Pasada:
15 15 67 67 08 08 16 16 44 44 27 27 12 1235 35 56 56 21 21 13 13 28 2860 60 36 36 07 07 10 10
15 15 67 67 08 08 16 16 44 44 27 27 12 1235 35 56 56 21 21 13 13 28 2860 6036 36 07 07 10 10
2ra. Pasada: 2ra. Pasada:
15 15 67 67 08 08 16 16 44 44 27 27 12 12 35 35 56 56 21 21 13 13 28 2860 60 36 36 07 07 10 10
CLASIFICACIN POR SHELL
15 15 67 67 08 08 16 16 44 44 27 27 12 12 35 35 56 56 21 21 13 13 28 2860 60 36 36 07 07 10 10
3ra. Pasada: 3ra. Pasada:
15 15 67 67 08 08 16 16 44 44 27 27 12 12 35 3556 56 21 21 13 13 28 28 60 60 36 36 07 0710 10
4ta. Pasada: 4ta. Pasada:
15 15 67 67 08 0816 16 44 44 27 27 12 12 35 3556 56 21 2113 13 28 28 60 60 36 36 07 0710 10
15 15 67 67 08 08 16 16 44 44 27 27 12 12 35 35 56 56 21 21 13 13 28 28 60 60 36 36 07 07 10 10
CLASIFICACIN POR SHELL
Su complejidad es difcil de calcular
y depende mucho de la secuencia
de incrementos que utilice

En 1969 Pratt descubri que el
tiempo de ejecucin del algoritmo es
del orden n*(log n)
2
.

Se han efectuado estudios
empricos sumamente amplios y al
parecer, cuando n es grande, el
nmero de movimientos flucta
entre n
5/4
y 1.6n
5/4
.

En general este mtodo es el
escogido para muchas aplicaciones
reales por ser muy simple teniendo
un tiempo de ejecucin aceptable
incluso para grandes valores de n.
CLASIFICACIN POR SHELL
algoritmo SHELL(a, ult)
entero: i,j,h,N
N(ult-prim+1) (* numero de elementos *)
h1
REPETIR
h3*h+1
HASTA h>N (* construimos la secuencia *)
REPETIR
hh DIV 3
para ih+1 hasta N hacer
va[i]
ji
mientras (j>h) y (a[j-h+prim-1]>v) hacer
a[j+prim-1]a[j-h+prim-1]
jj-1
hh-1
finmientras
a[j+prim-1]v
finpara
HASTA h=1
finSHELL
CLASIFICACIN POR QUICKSORT
Este mtodo es el ms eficiente y veloz de los
mtodos de clasificacin.

Conocido como clasificacin rpida y
clasificacin por particin.

La idea del algoritmo es la siguiente:

Se toma un elemento X de una posicin
cualquiera del arreglo.
Se trata de ubicar X en la posicin
correcta del arreglo.
Se repiten los pasos pero ahora con los
conjuntos de datos que se encuentran a la
izquierda y a la derecha de la posicin
correcta de X en el arreglo.
El proceso termina cuando todos los
elementos se encuentran en su posicin
correcta en el arreglo.
Sea lo que deseamos clasificar. 15 67 08 16 44 27 12 35
Se selecciona L[1] = 15 = X y se compara con los siguientes:
Recorremos de derecha a izquierda

X <= L[8] (15 <= 35) no hay intercambio
X <= L[7] (15 <= 12) si hay intercambio
Queda como sigue: 12 67 08 16 44 27 15 35

Recorremos de izquierda a derecha
X >= L[2] (15 >= 67) si hay intercambio
Queda como sigue: 12 15 08 16 44 27 67 35

Recorrido de Derecha a izquierda
X <= L[6] (15 <= 27) no hay intercambio
X <= L[5] (15 <= 44) no hay intercambio
X <= L[4] (15 <= 16) no hay intercambio
X <= L[3] (15 <= 08) si hay intercambio
Queda como sigue: 12 08 15 16 44 27 67 35
CLASIFICACIN POR QUICKSORT
Sea lo que deseamos clasificar. 15 67 08 16 44 27 12 35
12 08 16 44 27 67 35
1ra. Pasada
15
08 12 44 27
67 35 2da. Pasada
15 16
15 35 27
44
08 12
3ra. Pasada
16 67
15 16
35 44
08
27
12
4ra. Pasada
67
15 27 16 44 12 35 08
5ta. Pasada
67
CLASIFICACIN POR QUICKSORT
En el mejor caso, se escoge el elemento
de la posicin central del conjunto de
datos para analizar.

El peor caso ocurre cuando los
elementos ya estn ordenados o los
mismos se encuentran en orden inverso.

Pues al seleccionar el primer elemento se
particionar el arreglo en dos nuevos
conjuntos de 0 y (n-1) elementos.

CLASIFICACIN POR QUICKSORT
Anlisis de la Clasificacin por Quicksort
Diversos estudios realizados sobre su comportamiento
demuestran que si se escoge en cada pasada el
elemento que ocupa la posicin central del conjunto de
datos a analizar , el numero de pasadas necesarias
para ordenarlo es del orden logn.

Respecto al numero de comparaciones si el tamao del
arreglo es de potencia de 2 , en la primera pasada ser
(n-1) comparaciones, en la segunda ser (n-1)/2, pero
en dos conjuntos diferentes, en la tercera pasada
realizara (n-1)/4 comparaciones, pero en cuatro
conjuntos diferentes:
) 1 (
) 1 (
* ) 1 ( ...
4
) 1 (
* 4
2
) 1 (
* 2 ) 1 (

+ +

+ =
n
n
n
n n
n C
) 1 ( ... ) 1 ( ) 1 ( ) 1 ( + + + + = n n n n C
Anlisis de la Clasificacin por Quicksort
Si el numero de trminos de la sumatoria es igual a m:
m n C * ) 1 ( =
Considerando que el numero de trminos de la sumatoria
es igual al numero de pasadas y que este es igual a log n
la expresin queda:
n n C log * ) 1 ( =
CLASIFICACIN POR MEZCLA
DIRECTA
Consiste en la realizacin sucesiva de una
particin y una fusin que produce secuencias
ordenadas de longitud 1

Y la fusin o mezcla produce secuencias
ordenadas de longitud 2.

En la segunda pasada la particin es de
longitud 2

Y la fusin o mezcla produce secuencias
ordenadas de longitud 4.

Hasta que la longitud de la secuencia para la
particin sea mayor o igual que el nmero de
elementos del archivo original.
Ejemplo.

Desea ordenar las claves del arreglo F. Se usan dos arreglos
auxiliares F1 y F2.

F: 09 75 14 68 29 17 31 25 04 05 13 18 72 46 61

Primera Pasada:

F1: 09 14 29 31 04 13 72 61
F2: 75 68 17 25 05 18 46

Fusin en secuencias de longitud 2.
F: 09 75 14 68 17 29 25 31 04 05 13 18 46 72 61
CLASIFICACIN POR MEZCLA
DIRECTA
Segunda Pasada:
Particin en secuencias de longitud 2.
F1: 09 75 17 29 04 05 46 72
F2: 14 68 25 31 13 18 61

Fusin en secuencias de longitud 4.
F: 09 14 68 75 17 25 29 31 04 05 13 18 46 61 72

Tercera Pasada:
Particin en secuencias de longitud 4.
F1: 09 14 68 75 04 05 13 18
F2: 17 25 29 31 46 61 72

Fusin en secuencias de longitud 8.
F: 09 14 17 25 29 31 68 75 04 05 13 18 46 61 72
CLASIFICACIN POR MEZCLA
DIRECTA
Cuarta Pasada:
Particin en secuencias de longitud 8.
F1: 09 14 17 25 29 31 68 75
F2: 04 05 13 18 46 61 72

Fusin en secuencias de longitud 16.
F: 04 05 09 13 14 17 18 25 29 31 46 61 68 72 75

CLASIFICACIN POR MEZCLA
DIRECTA
CLASIFICACIN POR MEZCLA
DIRECTA
Usando la tcnica de divide-y-vencers, si un problema es
demasiado grande para resolverlo de una vez, se descompone en
varias partes ms fciles de resolver. Con ms formalidad, dado
un problema a resolver planteado en trminos de una entrada de
tamao n, la tcnica de divide la entrada en b subproblemas, 1<b<
n. Estos subproblemas se resuelven independientemente y
despus se combinan sus soluciones parciales para obtener la
solucin del problema original.

En la funcin de recurrencia para divide-y-vencers, n es el
tamao del problema principal, b son los subproblemas (1<b< n),
cada uno de tamao n/c (1<c< n). Para dividir el problema en
subproblemas y combinar las soluciones de los subproblemas
existe cierto costo no recursivo que se expresan en f(n).
) ( ) / ( ) ( n f c n bT n T + =
CLASIFICACIN POR MEZCLA
DIRECTA
El algoritmo de ordenamiento mergeSort es un ejemplo de la
aplicacin de la tcnica de divide-y-venceras.
Algoritmo mergeSort (E, p, u)
Entradas:
Arreglo E, e ndices p y u que delimitan
el subarreglo a ordenar contenido en E[p,...,u].
Salidas: E[p,...,u] en orden ascendente.

1 si (p < u) entonces //caso progresivo
2 m [(p + u)/2]
3 mergeSort(E, p, m)
4 mergeSort(E, m + 1, u)
5 fusionar(E, p, m, u)
6 finsi
El caso base del algoritmo
mergeSort no est explicito en el
algoritmo, pero sucede cuando
p u, e implica que no se
realizan comparaciones cuando
el arreglo es de tamao 1.


W(n) = 0 , si n=1
CLASIFICACIN POR
MEZCLA DIRECTA
Algoritmo mergeSort (E, p, u)
Entradas:
Arreglo E, e ndices p y u que delimitan
el subarreglo a ordenar contenido en E[p,...,u].
Salidas: E[p,...,u] en orden ascendente.

1 si (p < u) entonces //caso progresivo
2 m [(p + u)/2]
3 mergeSort(E, p, m)
4 mergeSort(E, m + 1, u)
5 fusionar(E, p, m, u)
6 finsi
CLASIFICACIN POR
MEZCLA DIRECTA
Cuando el arreglo es de tamao
mayor de n, el nmero de
comparaciones se puede derivar
aplicando la frmula para los
algoritmos de tipo divide-y-
venceras.
) 1 ( ]) 2 / ([ 2 ) ( + = n n W n W
Si n > 1
Comparaciones para ordenar por
separado las parte derecha e
izquierda que son de tamao
[n/2] (b=2, c=2).

Comparaciones para fusionar dos subarreglos
ordenados de tamao [n/2] en el peor caso
se toma alternadamente un elemento de
cada subarreglo, requiriendose n-1
comparaciones ( f(n)= n-1 ).

Reuniendo en una sola expresin
los casos base y recursivo, la
complejidad del algoritmo mergeSort
en el peor caso es como sigue.

> +
=
=
0 si ) 1 ( ]) 2 / ([ 2
0 si 0
) (
n n n W
n
n W
Algoritmo mergeSort (E, p, u)
Entradas:
Arreglo E, e ndices p y u que delimitan
el subarreglo a ordenar contenido en E[p,...,u].
Salidas: E[p,...,u] en orden ascendente.

1 si (p < u) entonces //caso progresivo
2 m [(p + u)/2]
3 mergeSort(E, p, m)
4 mergeSort(E, m + 1, u)
5 fusionar(E, p, m, u)
6 finsi
CLASIFICACIN POR
MEZCLA DIRECTA
CLASIFICACIN POR
MEZCLA DIRECTA
Como cualquiera de los algoritmos de ordenamiento
recursivo tiene complejidad logartmica: O(n log

n).

La eficiencia de este algoritmo es bastante notable en
tiempo de ejecucin en comparacin con otros, ya que su
manera de trabajo por grupos pequeos agiliza la
organizacin de los datos.

recomendable cuando la cantidad de registros no es muy
grande ya que para hacer las mezclas ste mtodo utiliza
el doble del espacio que gasta el arreglo original de
valores.

Este es un algoritmo estable (no intercambia los registros
con claves iguales) dependiendo de la forma en que se
implemente, recursivo y por tanto de complejidad O(n log

n)
tanto en el peor caso como en el mejor o en el caso
promedio pues el tiempo que emplea no depende de la
disposicin inicial de los datos
CLASIFICACIN POR
MEZCLA DIRECTA
VENTAJAS
A diferencia de algunas versiones
mejoradas del QuickSort, MergeSort es un
mtodo estable de ordenamiento mientras
la operacin de mezcla (Merge) sea
implementada correctamente.

Una gran ventaja del MergeSort es que su
algoritmo tiene mucha estabilidad (se
evitan los problemas de intercambio de
claves en la manipulacin de datos).

Este algoritmo es efectivo para conjuntos
de datos que se puedan acceder
secuencialmente como arreglos, vectores y
listas ligadas


CLASIFICACIN POR
MEZCLA DIRECTA
DESVENTAJAS
Su principal desventaja radica en que est definido
recursivamente y su implementacin no recursiva emplea
una pila, por lo que requiere un espacio adicional de
memoria para almacenarla.

A los algoritmos que realizan el proceso de ordenamiento
dentro del mismo vector se les denomina algoritmos de
ordenamiento "in-situ", el algoritmo de MergeSort no
pertenece a esta familia ya que no utiliza el espacio sobre el
que estn almacenados los datos sino que para poder
funcionar requiere de un espacio de memoria adicional del
tamao de los datos a ordenar en el cual se realicen las
mezclas
Laboratorio
Implementando los siguientes algoritmos de clasificacin en
java o C++, en archivos directos (in situ):

Shell
Quicksort


1. Pruebe luego para todos ellos con diferentes tamaos de
entrada(n)
2. Aprecie la evolucin del tiempo de ordenacin con respecto
al numero de datos a ordenar. Haga una grafica.

Anda mungkin juga menyukai