Você está na página 1de 119

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 por interpolacin.
Bsqueda indexada

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).
12 18 23 34 45 47 60 72
0 1 2 3 4 5 6 7
Datos de entrada

Cantidad de datos : n= 8
Arreglo : v
Encontrar : valor =45

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
BUSQUEDA SECUENCIAL
i V[i] = valor encontr para
0 12 = 45 falso sigue
1 18 = 45 falso sigue
2 23 = 45 falso sigue
3 34 = 45 falso sigue
4 45 = 45 verdadero sigue
5 47 = 45 verdadero sigue
6 60 = 45 verdadero sigue
7 72 = 45 verdadero sale
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
BUSQUEDA SECUENCIAL
CON CENTINELA
12 18 23 34 45 47 60 72
0 1 2 3 4 5 6 7
Datos de entrada

Cantidad de datos : n= 8
Arreglo : v
Encontrar : Valor =45

Salida

BusSecSentinela retorna falso o
verdadero
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
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
BUSQUEDA SECUENCIAL
CON CENTINELA
12 18 23 34 45 47 60 72
0 1 2 3 4 5 6 7
Datos de entrada

Cantidad de datos : n= 8
Arreglo : v
Encontrar : valor =45

i V[i] < valor ^ i < n mientras
0 12< 45 y 0 < 8 Entra
1 18<45 y 1 < 8 Entra
2 23<45 y 2 < 8 Entra
3 34<45 y 3 < 8 Entra
4 45<45 y 4 < 8 Sale
45 = 45
encontr verdadero
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.

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

As, el algoritmo de
bsqueda binaria realiza
log
2
(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
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
izq der
medio
valor
izq
der medio
valor
der
medio
valor
izq
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
Buscar el valor=80
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
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 un
arreglo.
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.
interpolacin
extrapolacin
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:
class ElemIndice{
private int clave;
private int posicion;

public ElemIndice(int c, int p){
clave=c;
posicion=p;
}
public int getClave(){ return clave; }

public int getPosicion(){
return posicion;
}
}
BUSQUEDA INDEXADA
Mediante cada elemento del array ndice se asocian grupos
de elementos del array inicial. Los elementos en el ndice y
en el array deben estar ordenados.

El mtodo consta de dos pasos:

Buscar en el array_ndice el intervalo correspondiente
al elemento buscado.
Restringir la bsqueda a los elementos del intervalo
que se localiz previamente.

La ventaja del mtodo estriba en que la bsqueda se realiza
inicialmente en el array de ndices, cuantitativamente ms
pequea que el array de elementos. Cuando se ha
encontrado el intervalo correcto, se hace una segunda
bsqueda en una parte reducida del array. Estas dos
bsquedas pueden ser secuenciales o binarias y el tiempo
de ejecucin depender del tipo de bsqueda utilizado en
cada uno de los arrays
BUSQUEDA INDEXADA
3 4 5 6 7 8 9 10 14 16 19
0 1 2 3 4 5 6 7 8 9 10
1. Se decide dividir el array inicial en
bloques de tres elementos.

2. El array ndice estar formado por
n/k+1 elementos, por no ser el ltimo
bloque de igual tamao, es decir,
11/3+1= 4
3 6 9 16
0 3 6 9
0 1 2 3
CLAVE
POSICION
BUSQUEDA INDEXADA
3 4 5 6 7 8 9 10 14 16 19
3 6 9 16
0 3 6 9
0 1 2 3
CLAVE
POSICION
Se puede implementar la bsqueda binaria en el
array de ndices.

Cuando finaliza la bsqueda, o ha encontrado el
elemento buscado o est en la posicin que contiene
al elemento mayor de los ms pequeos al elemento
buscado

Si X = 10, en el array de ndice indicar la posicin 2.
Por lo tanto, la bsqueda en el array inicial
comenzar en la posicin 6 hasta el final del bloque.
BUSQUEDA INDEXADA
public ElemIndice [] crearArrayIndice(int k){
int n_indices;
int n = A.length;
if (n%k == 0) n_indices = n/k;
else n_indices = n/k + 1;
ElemIndice [] arrayIndice = new ElemIndice[n_indices];
int cont = 0;
for (int i = 0; i<n_indices; i++){
array_indice[i]= new ElemIndice(A[cont],cont);
//cont apunta al primer elemento de cada
//bloque del array grande
cont += k;
}
return arrayIndice;
}
3 4 5 6 7 8 9 10 14 16 19
CLAVE
POSICION
3 6 9 16
0 3 6 9
0 1 2 3
VENTAJAS Y DESVENTAJAS
Ventajas

Rpido acceso
El sistema se encarga de relacionar la
posicin de cada registro con su
contenido mediante la tabla de ndices

Desventajas

Desaprovechamiento del espacio por
quedar huecos intermedios cada vez que
actualiza la estructura.
Se necesita espacio adicional para el
rea de ndices
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 por interpolacin.
Bsqueda indexada

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).

La bsqueda por interpolacin es una modificacin del algoritmo
de bsqueda binaria, tambin de complejidad O(log n).

La bsqueda indexada acelerara la bsqueda a niveles O(log n)
siempre y cuando se utilice bsqueda binaria en cualquiera de las
areas de bsqueda


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 ordenamiento que trabajan con
estructuras de datos residentes en memoria
principal se denominan Ordenamientos
Internos, mientras que las implementaciones
que utilizan estructuras de datos residentes en
archivos se conocen como Ordenamientos
externos.
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).
ORDENAMIENTO INTERNO
Directos (burbuja, seleccin
e insercin).




Logartmicos (Shell sort,
Merge sort, Heap sort, Quick
sort, Radix).
Dividiremos los mtodos en
dos grandes grupos:
En arreglos grandes las
ordenaciones directas
resultan ineficientes y se
necesitara un mtodo
logartmico para su
solucin.
En el caso de listas pequeas,
los mtodos directos se
desempean de manera
relativamente eficientes, ya que
la codificacin del algoritmo
correspondiente no es compleja.
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:
a: 15 67 08 16 44 27 12 35
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
15 67 8 16 44 27 12 35
1 2 3 4 5 6 7 8
67<15
8<15 Menor= 8
16<8
44<8
27<8
12<8
35<8
menor= 15 i=1
8 67 15 16 44 27 12 35
8 67 15 16 44 27 12 35
8 12 15 16 44 27 67 35
8 12 15 16 44 27 67 35
8 12 15 16 44 27 67 35
8 12 15 16 27 44 67 35
8 12 15 16 27 35 67 44
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
8 12 15 16 27 35 44 67
15 67 08 16 44 27 12 35
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
CLASIFICACIN POR INTERCAMBIO
algoritmo burbuja(a, n)
para i0 hasta i<n hacer
para j0 hasta j<(n-1 ) hacer
si a[ j]> a[ j+1 ] entonces
auxa[ j ]
a[ j ]a[ j+1 ]
a[ j +1]aux
finsi
finpara
finpara
finburbuja
A[ j ]>a[ j+1] ARREGLO
15>67
15 67 8 16 44 27 12 35
67>8
15 8 67 16 44 27 12 35
67>16
15 8 16 67 44 27 12 35
67>44
15 8 16 44 67 27 12 35
67>27
15 8 16 44 27 67 12 35
67>12
15 8 16 44 27 12 67 35
67>35
15 8 16 44 27 12 35 67
Cuando i=0
CLASIFICACIN POR INTERCAMBIO
Iteraciones
( i )
ARREGLO
0
15 8 16 44 27 12 35 67
1
8 15 16 27 12 35 44 67
2
8 15 16 12 27 35 44 67
3
8 15 12 16 27 35 44 67
4
8 12 15 16 27 35 44 67
5
8 12 15 16 27 35 44 67
6
8 12 15 16 27 35 44 67
7
8 12 15 16 27 35 44 67
algoritmo burbuja(a, n)
para i0 hasta i<n hacer
para j0 hasta j<(n-1 ) hacer
si a[ j]> a[ j+1 ] entonces
auxa[ j ]
a[ j ]a[ j+1 ]
a[ j +1]aux
finsi
finpara
finpara
finburbuja
Ejemplo:
Arreglo con elementos: 15 67 08 16 44 27 12 35
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
CLASIFICACIN POR INTERCAMBIO
MEJORADO
procedimiento BURBUJA(NUMERO a, n)
logico: salirverdadero
entero: t
mientras(salir =verdadero) hacer
salir falso
para( i 0 hasta i < (n-1)) hacer
si (a[i].num > a[i+1].num) entonces
t= a[i].num
a[i]=a[i+1]
a[i+1].num=t
salir verdadero
finsi
finpara
finmientras
finBURBUJA
Existe una versin mejorada
de dicho algoritmo en donde
se integra una variable que
funge como switch (bandera)
que permite detectar el
momento en que ya no se
presenten mas intercambios
aunque su mejora no suele
ser tan importante pues el
algoritmo sigue
comportndose como una
ordenacin cuadrtica O(n
2
).
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 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.
procedimiento SHELL(a, n)
entero : incri, j , temp, i
incr n/2
mientras (incr > 0) hacer
para (i incr hasta i<n) hacer
temp a[i].num
j i
mientras((j incr) y (a[j-incr].num>temp)) hacer
a[ j ] a[ j incr ]
j j - incr
finmientras
a[j].num temp
finpara
incr incr / 2
finhacer
finSHELL

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.
procedimiento SHELL(a, n)
entero: incr, j, temp, i
incrn/2
mientras (incr > 0) hacer
para i incr hasta i<n hacer
temp a[i].num
j i
mientras(( j >incr) y (a[j-incr].num > temp)) hacer
a[j] a[j-incr]
j j - incr
finmientras
a[j].num temp
finpara
incr (incr / 2)
finmientras
finSHELL
CLASIFICACIN POR 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.
15 67 08 16 44 27 12 35 56 21 13 28 60 36 07 10
CLASIFICACIN POR SHELL
15 21 08 16 44 27 07 10 56 67 13 28 60 36 12 35
GRUPOS DE 8
Pasada 1
15 21 08 16 44 27 07 10 56 67 13 28 60 36 12 35
15 21 07 10 44 27 08 16 56 67 13 28 60 36 12 35
15 21 07 10 44 27 08 16 56 67 13 28 60 36 12 35
15 21 07 10 44 27 08 16 56 36 12 28 60 67 13 35
GRUPOS DE 4
Pasada 1
CLASIFICACIN POR SHELL
CLASIFICACIN POR SHELL
GRUPOS DE 2
Pasada 1
15 21 07 10 44 27 08 16 56 36 12 28 60 67 13 35
07 10 15 21 44 27 08 16
08 16 44 27 56 36 12 28
12 28 56 36 13 35 60 67

07 10 15 21 08 16 44 27 12 28 56 36 13 35 60 67

07 10 15 21 08 16 44 27 12 28 56 36 13 35 60 67
08 21 15
16 15 21 44 27
12 27 44 28 56 36
13 36 56
35 56 36 60 67
07 10 08 16 15 21 12 27 44 28 13 35 56 36 60 67

Pasada 2
CLASIFICACIN POR SHELL
GRUPOS DE 2
Pasada 3
Pasada 4
07 10 08 16 15 21 12 27 44 28 13 35 56 36 60 67
12 21 15 27 44 28
13 28 44 35 56 36 60 67

07 10 08 16 12 21 15 27 13 28 44 35 56 36 60 67
07 10 08 16 12 21 15 27 13 28 44 35 56 36 60 67
13 27 15 28 44 35 56 36 60 67

07 10 08 16 12 21 13 27 15 28 44 35 56 36 60 67
CLASIFICACIN POR SHELL
07 10 08 16 12 21 13 27 15 28 44 35 56 36 60 67
08 10 16
12 16 21
13 21 27
15 27 28 44
35 44 56
36 56 60 67
07 08 10 12 16 13 21 15 27 28 35 44 36 56 60 67
GRUPOS DE 1
Pasada 1
Pasada 2
07 08 10 12 16 13 21 15 27 28 35 44 36 56 60 67
13 16 21
15 21 27 28 35 44
36 44 56 60 67
07 08 10 12 13 16 15 21 27 28 35 36 44 56 60 67
07 08 10 12 13 16 15 21 27 28 35 36 44 56 60 67
15 16 21 27 28 35 36 44 56 60 67
07 08 10 12 13 15 16 21 27 28 35 36 44 56 60 67
Pasada 3
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
.

La velocidad del algoritmo depender de
los incrementos con los cuales trabaja
utilizndolos como distancias entre
elementos a intercambiar. Veremos que
con algunas secuencias podremos
obtener ordenes de tiempo de ejecucin
en el peor caso de O(n
2
), O(n
3/2
) y O(n
4/3
).

Es el algoritmo ms adecuado para
ordenar entradas de datos
moderadamente grandes (decenas de
millares de elementos) ya que su
velocidad, si bien no es la mejor de todos
los algoritmos, es aceptable en la prctica
y su implementacin (cdigo) es
relativamente sencillo.

CLASIFICACIN POR SHELL
procedimiento SHELL(a, n)
entero: incr, j, temp, i
incrn/2
mientras (incr > 0) hacer
para i incr hasta i<n hacer
temp a[ i ].num
j i
mientras(( j >incr) y (a[j-incr].num > temp)) hacer
a[ j ] a[ j-incr ]
j j - incr
finmientras
a[ j ].num temp
finpara
incr (incr / 2)
finmientras
finSHELL
SECUENCIAS DE INCREMENTOS
USADAS POR SHELL
La propuesta por Shell: n/2, n/4, ..., n/(2k), ..., 1.

Ventajas:

es fcil de calcular.

Desventajas:

no optimiza mucho la velocidad
del algoritmo puesto que los
incrementos tienen factores
comunes (no son primos
relativos). El tiempo de
ejecucin promedio con esta
secuencia de incrementos ser
O(n
2
).
Donde k se elije de modo tal que
2
k
-1 < n/2 y 2
k+1
-1 > n/2.

Aunque no se ha podido demostrar
formalmente (slo por medio de
simulaciones), utilizar esta
secuencia de incrementos hace
que el algoritmo de Shell tenga un
tiempo de ejecucin promedio
O(n
5/4
).

Una cota para el peor caso es del
O(n
3/2
).

SECUENCIAS DE INCREMENTOS USADAS
POR SHELL
La propuesta por Hibbard: 2
K
-1, ..., 7, 3, 1;
f(1)=2
1
-1=1
f(2)=2
2
-1=3
f(3)=2
3
-1=7
con la cual se pueden obtener tiempos
de ejecucin O(n
4/3
) para el peor caso y
O(n
7/6
) para el caso promedio
SECUENCIAS DE INCREMENTOS
USADAS POR SHELL
Los incrementos de Sedgewick se
calculan intercalando los valores de las
siguientes funciones
1 ) 3 2 )( 2 ( ) (
1 ) 2 ( 9 ) 4 ( 9 ) (
2 2
+ =
+ =
+ + i i
i i
i g
i f
f(0)=9(4
0
)-9(2
0
)+1=1
f(1)=9(4
1
)-9(2
1
)+1=19
f(2)=9(4
2
)-9(2
2
)+1=109
f(0)=(2
2
)(2
2
-3)+1=5
f(1)=(2
3
)(2
3
-3)+1=41
f(2)=(2
4
)(2
4
-3)+1=209
La propuesta por Sedgewick: g(i), f(i), ... , 41, 19, 5, 1;
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 funcin de este sistema de ordenamiento en
una estructura de datos desorganizada es
escoger un pivote, el cual puede ser elegido al
azar. Despus empieza a ordenar del lado
izquierdo a todos los elementos menores que el
pivote de manera recursiva hasta que queden
ordenados y lo mismo del lado derecho, hasta el
punto en que ambos lados quedan en orden, y
por consecuencia toda la lista.

funcion PARTICION(a, l, r) : entero
entero : pivot, i, j, t
pivot a[ l ].num
salir verdadero
i l+1
j r
mientras( salir) hacer
mientras( a[i].num s pivot y i s r ) hacer
ii+1
finmientras
mientras( a[j].num > pivot ) hacer
jj -1
finmientras
si( i > j ) entonces
salirfalso
finsi
t a[ i ].num
a[ i ] a[ j ]
a[ j ].num t
finmientras
t a[ l ].num
a[ l ] a[ j ]
a[ j ].num t
retornar j
finPARTICION
procedimiento QUICKSORT( a, l, r)
entero: j, l, r
si( l < r ) entonces
j PARTICION( a, l, r)
QUICKSORT( a, l, j-1)
QUICKSORT( a, j+1, r)
finsi
finQUICKSORT
CLASIFICACIN POR
QUICKSORT
0 1 2 3 4 5 6 7 8 9
42 89 63 12 94 27 78 3 50 36
pivote=42
0 1 2 3 4 5 6 7 8 9
42 36 63 12 94 27 78 3 50 89
0 1 2 3 4 5 6 7 8 9
42 36 3 12 94 27 78 63 50 89
0 1 2 3 4 5 6 7 8 9
42 36 3 12 27 94 78 63 50 89
0 1 2 3 4 5 6 7 8 9
27 36 3 12 42 94 78 63 50 89
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.


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 MONTICULOS
(HEAPSORT)
Es un algoritmo que se construye
utilizando las propiedades de los
montculos binarios.

El orden de ejecucin para el peor caso
es O(nlog n), siendo n el tamao de la
entrada.

Aunque tericamente es ms rpido
que los algoritmos de ordenacin vistos
hasta aqu, en la prctica es ms lento
que el algoritmo de ordenacin de Shell
utilizando la secuencia de incrementos
de Sedgewick.
Caractersticas
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
Montculos binarios
Un montculo Max es un rbol binario
completo cuyos elementos estn
ordenados del siguiente modo:

para cada subrbol se cumple que la
raz es mayor que ambos hijos. Si el
montculo fuera Min, la raz de cada
subrbol tiene que cumplir con ser
menor que sus hijos.

Para representar ste arbol se utiliza un
array de datos, en el que se acceden a
padres e hijos utilizando las siguientes
transformaciones sobre sus ndices. Si el
montculo est almacenado en el array A,
el hijo izquierdo de A[i] es A[2*i] y el hijo
derecho de A[i] es A[2*i+1].
16
14 10
3 9 7 8
1 4 2
1
2 3
4 5 6 7
10 8 9
16 14 10 8 7 9 3 2 4 1
1 2 3 4 5 6 7 8 9 10
El padre de A[8] es A[4]=8 donde
i=8, entonces 8/2=4
Se puede referenciar en tiempo O(1) al padre e
hijos de un nodo cualquiera segn las siguientes
frmulas:

Al insertar o eliminar elementos de un montculo,
hay que cuidar de no destruir la propiedad de
orden del montculo. Lo que se hace generalmente
es construir rutinas de filtrado (que pueden ser
ascendentes o descendentes) que tomen un
elemento del montculo (el elemento que viola la
propiedad de orden) y lo muevan vrticalmente por
el rbol hasta encontrar una posicin en la cual se
respete el orden entre los elementos del montculo.

Tanto la insercin como la eliminacin
(eliminar_min o eliminar_max segn sea un
montculo Min o Max respectivamente), de un
elemento en un montculo se realizan en un tiempo
O(log n), peor caso (y esto se debe al orden entre
sus elementos y a la caracterstica de rbol binario
completo).
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
Se insertara
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
Datos a ordenar:
25, 15, 20, 3, 5, 10
Se construye el rbol
25
15 20
3
5 10
25 15 20 3 5 10
0 1 2 3 4 5
0
1 2
3 4 5
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
k=6, Intercambiar nodo 0 con 5
25
15 20
3
5 10
10 15 20 3 5 25
0 1 2 3 4 5
0
1 2
3 4 5
10
15 20
3
5 25
0
1 2
3
4 5
resultado
25 15 20 3 5 10
0 1 2 3 4 5
ANTES
DESPUES
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
Revisar y recuperar la condicin de heap, sino
se cumple entre los nodos 0 y 4
20 10 15 3 5 25
0 1 2 3 4 5
10
15 20
3
5 25
0
1 2
3 4 5
resultado
15
10 20
3
5 25
0
1 2
3 4 5
20
10 15
3
5 25
0
1 2
3 4 5
r
e
s
u
l
t
a
d
o

K= 5, Intercambiar nodo 0 con 4
20
15 10
3
5 25
5 15 10 3 20 25
0 1 2 3 4 5
0
1 2
3 4 5
resultado
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
5
15 10
3
20 25
0
1 2
3 4 5
20 10 15 3 5 25
0 1 2 3 4 5
ANTES
DESPUES
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
Revisar y recuperar la condicin de heap, sino
se cumple entre los nodos 0 y 3
15 5 10 3 20 25
0 1 2 3 4 5
5
15 10
3
20 25
0
1 2
3 4 5
resultado
15
5 10
3
20 25
0
1 2
3 4 5
K= 4, Intercambiar nodo 0 con 3
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
15
5 10
3
20 25
0
1 2
3 4 5
resultado
3
5 10
15
20 25
0
1 2
3 4 5
3 5 10 15 20 25
0 1 2 3 4 5
15 5 10 3 20 25
0 1 2 3 4 5
ANTES
DESPUES
Revisar y recuperar la condicin de heap, sino
se cumple entre los nodos 0 y 2
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
3
5 10
15
20 25
0
1 2
3 4 5
resultado
5
3 10
15
20 25
0
1 2
3 4 5
10
3 5
15
20 25
0
1 2
3 4 5
10 3 5 15 20 25
0 1 2 3 4 5
r
e
s
u
l
t
a
d
o

CLASIFICACIN POR MONTICULOS
(HEAPSORT)
K= 3, Intercambiar nodo 0 con 2
10
3 5
15
20 25
0
1 2
3 4 5
resultado
5
3 10
15
20 25
0
1 2
3 4 5
5 3 10 15 20 25
0 1 2 3 4 5
10 3 5 15 20 25
0 1 2 3 4 5
ANTES
DESPUES
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
Revisar y recuperar la condicin de
heap, sino se cumple entre los
nodos 0 y 1
5
3 10
15
20 25
0
1 2
3 4 5
3 5 10 15 20 25
0 1 2 3 4 5
3
5 10
15
20 25
0
1 2
3 4 5
resultado
Ya esta
ordenado!
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
Su desempeo es en
promedio tan bueno como
el Quicksort y se comporta
mejor que este ltimo en
los peores casos.
VENTAJAS
void SELECCIONAR(int * v, int izq, int der){
// ordenacion descendente
int i, j,salir;
int aux;
i = izq;
j = 2*i + 1;
aux = v[ i ];
salir = 0;
while(j <= der && (salir == 0)){
if( j < der)
if( v[ j ] < v[ j+1 ] )
j++; //mayor de los dos hijos
if( aux >= v[ j ] ) salir = 1;
else{
v[ i ] = v[ j ];
i = j;
j = 2 * i + 1;
}
}
v[ i ] = aux;
}
CLASIFICACIN POR MONTICULOS
(HEAPSORT)
Aunque el Heapsort tiene un
mejor desempeo general que
cualquier otro mtodo
presentado de clasificacin
interna, es bastante complejo
de programar.
DESVENTAJAS
void heapSort(int *vector, int num) {
int i, j;
int ultimo = num-1;
int aux;

// ser ordena el monticulo
for(i = (ultimo-1)/ 2; i>=0; i--){
SELECCIONAR(vector, i, ultimo);
}
// Ordenacion del vector
for(i = ultimo; i >= 1; i--){
aux = vector[ 0 ];
vector[ 0 ] = vector[ i ];
vector[ i ] = aux;
SELECCIONAR(vector, 0, i-1);
}
}
CLASIFICACIN POR MEZCLA
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
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
CLASIFICACIN POR MEZCLA
6 5 3 1 8 7 2 4
1 2 2 3 4 5 6 6
2 4 5 6 1 2 3 6
2 5 4 6 1 3 2 6
5 2 4 6 1 3 2 6
Ejemplo.
Arreglo a ordenar
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
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
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
CLASIFICACIN POR MEZCLA
Como cualquiera de los algoritmos de ordenamiento
recursivo tiene complejidad logartmica: O(nlog
2
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(nlog
2
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
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
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
CLASIFICACIN
RADIX SORT
Este ordenamiento se basa en los
valores de los dgitos reales en las
representaciones de posiciones de los
nmeros que se ordenan.

Por ejemplo el nmero 235 se escribe 2
en la posicin de centenas, un 3 en la
posicin de decenas y un 5 en la
posicin de unidades
2 3 5
centenas decenas
unidades
REGLAS DEL
RADIX SORT
Empezar en el dgito ms significativo y
avanzar por los dgitos menos
significativos mientras coinciden los
dgitos correspondientes en los dos
nmeros.

El nmero con el dgito ms grande en
la primera posicin en la cual los
dgitos de los dos nmeros no
coinciden es el mayor de los dos (por
supuesto s coinciden todos los dgitos
de ambos nmeros, son iguales).
4 5 6 7
Digito menos
significativo
Digito mas
significativo
REGLAS DEL
RADIX SORT
25 57 48 37 12 92 86 33
0
1
2 12 92
3 33
4
5 25
6 86
7 57 37
8 48
9
10
12 92 33 25 86 57 37 48
antes
despus
PRIMERA PASADA
12 92 33 25 86 57 37 48
Arreglo original
REGLAS DEL
RADIX SORT
0
1 12
2 25
3 33 37
4 48
5 57
6
7
8 86
9 92
10
12 92 33 25 86 57 37 48
antes
despus
SEGUNDA PASADA
12 25 33 37 48 57 86 92
YA ESTA
ORDENADO!
EFICIENCIA DEL
RADIX SORT
Suponiendo que los n nmeros de
entrada tienen una cantidad k de dgitos,
el algoritmo tomara un tiempo mximo de
O(kn), sea O(n), lo cual es lo mismo
para el caso promedio

En los mejores casos toma un tiempo de
O(n log n)

El ordenamiento por radix puede
ejecutarse hasta en el doble de velocidad
que Quicksort, pero no vale la pena
intentarlo si existe problemas potenciales
de espacio de almacenamiento o si las
llaves son de tamao variable y/o no son
aleatorias
AJUSTES AL
RADIX SORT
0 120 80 30 20
1 241
2 12
3
4
5
6
7
8
9
10
20 12 120 30 80 241
antes
despus
PRIMERA PASADA
120 80 30 20 241 12
AJUSTES AL
RADIX SORT
0
1 12
2 120 20
3 30
4 241
5
6
7
8 80
9
10
120 80 30 20 241 12
antes
despus
SEGUNDA PASADA
12 120 20 30 241 80
AJUSTES AL
RADIX SORT
0 012 020 030 080
1 120
2 241
3
4
5
6
7
8
9
10
12 120 20 30 241 80
antes
despus
TERCERA PASADA
12 20 30 80 120 241
YA ESTA
ORDENADO!
VENTAJAS DEL RADIX SORT
El ordenamiento es razonablemente
eficiente si el nmero de dgitos en las
llaves no es demasiado grande.

Si las mquinas tienen la ventaja de
ordenar los dgitos (sobre todo si estn en
binario) lo ejecutaran con mucho mayor
rapidez de lo que ejecutan una
comparacin de dos llaves completas.
Depende en que las llaves estn
compuestas de bits aleatorios en un orden
aleatorio. Si esta condicin no se cumple
ocurre una fuerte degradacin en el
desempeo de estos mtodos.

Adicionalmente, requiere de espacio
adicional para realizar los intercambios.

Los algoritmos de ordenamiento basados en
radix se consideran como de propsito
particular debido a que su factibilidad
depende de propiedades especiales de las
llaves, en contraste con algoritmos de
propsito general como Quicksort que se
usan con mayor frecuencia debido a su
adaptabilidad a una mayor variedad de
aplicaciones
DESVENTAJAS
DEL RADIX SORT
Es un trmino genrico para los algoritmos de
ordenamiento que pueden manejar grandes
cantidades de informacin. El ordenamiento
externo se requiere cuando la informacin que se
tiene que ordenar no cabe en la memoria principal
de una computadora (tpicamente la RAM) y un tipo
de memoria ms lenta (tpicamente un disco duro)
tiene que utilizarse en el proceso.

Existen otros tipos de memoria externa que son los
usb de almacenamiento entre otros. La Ordenacin
externa de los datos estn en un dispositivo de
almacenamiento externo (Archivos) y su
ordenacin es ms lenta que la interna.
CLASIFICACIN POR
MEZCLA DIRECTA
ORDENAMIENTO EXTERNO
CLASIFICACIN POR MEZCLA
DIRECTA
Consiste en la realizacin sucesiva de una
particin. Primero 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 archivo F. Se usan dos archivos
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
Fusin en secuencias de longitud 2.
F: 09 75 14 68 17 29 25 31 04 05 13 18 46 72 61

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
Resultado de la
primera pasada
Fusin en secuencias de longitud 8.
F: 09 14 17 25 29 31 68 75 04 05 13 18 46 61 72

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
Resultado de la
tercera pasada
YA ESTA
ORDENADO!
CLASIFICACIN EQUILIBRADA
FUSION 4, 5, 9, 13, 14, 17, 18, 25, 29, 31, 46, 61, 68, 72, 75
ARCHIVO ORIGINAL
09 75 14 68 29 17 31 25 04 05 13 18 72 46 61
F1: 9, 75 29 25 46 61
F2: 14, 68 17, 31 4, 5, 13, 18, 72
FUSION : 9, 14, 68, 75 17, 29, 31 4, 5, 13, 18, 25, 72, 46, 61
F1: 9, 14, 68, 75 4, 5, 13, 18, 25, 72
F2: 17, 29, 31 46, 61
FUSION 9, 14, 17, 29, 31, 68, 75 4, 5, 13, 18, 25, 46, 61, 72
F1: 9 14 17 29 31 68 75
F2: 4 5 13 18 25 46 61 72
YA ESTA
ORDENADO!
Laboratorio
Implementando los siguientes algoritmos de
clasificacin en java o C++(en archivos):

Mezcla Directa
Mezcla equilibrada

1. Presente su algoritmo de cada uno para ordenar

2. Pruebe los algoritmos con diferentes tamaos
de entrada(n) y aprecie la evolucin del tiempo
de ordenacin con respecto al numero de datos
a ordenar.

3. Determine cual de ellos es mas rapido

Você também pode gostar