Vous êtes sur la page 1sur 119

ALGORITMICA III

Algoritmos de
Bsqueda

Docente: Carlos A. Ruiz De La Cruz Melo


Correo: zorroculto69@hotmail.com

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

ALGORITMOS DE
BUSQUEDA
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.

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

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

Datos de entrada

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

V[i] = valor

encontr

para

12 = 45

falso

sigue

18 = 45

falso

sigue

23 = 45

falso

sigue

12

18 23 34

45 47

60 72

34 = 45

falso

sigue

45 = 45

verdadero

sigue

47 = 45

verdadero

sigue

60 = 45

verdadero

sigue

72 = 45

verdadero

sale

BUSQUEDA SECUENCIAL
CON CENTINELA
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.

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

12

18 23 34

45 47

60 72

Datos de entrada

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

Salida
BusSecSentinela retorna falso o
verdadero

BUSQUEDA SECUENCIAL
CON CENTINELA
Datos de entrada
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

45 = 45

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

12

18 23 34

45 47

60 72

V[i] < valor ^ i < n

mientras

12< 45 y 0 < 8

Entra

18<45 y 1 < 8

Entra

23<45 y 2 < 8

Entra

34<45 y 3 < 8

Entra

45<45 y 4 < 8

Sale

encontr verdadero

BUSQUEDA SECUENCIAL
CON CENTINELA
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).

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 BINARIA
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
log2(n) iteraciones y, por
tanto, su complejidad es
O(log n).

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
izq
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

valor

der

medio

valor

der

medio

izq
valor

medio

izq

der

BUSQUEDA BINARIA
Funcion BusquedaBinaria(v, valor): entero
posicion-1
5 10
encontradofalso
izq1
1
2
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
der
izqmedio+1
11
finsi
finsi
fin mientras
busquedaBinariaposicion
fin funcion

12

20

30

40

50

60

70

80

90

10

11

Buscar el valor=80

Izq Izq<der

medio

V[medio]

1 <11

40

7<11

70

10

10<11

10

80

posicin

10

BUSQUEDA BINARIA
En el vector (1,1,2,3,4,5,5,5,6,9) se va a buscar,
de forma binaria, el nmero 7

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

der

Izq Izq<der

medio

V[medio]

10

1 <10

6<10

9<10

10

10<10

10

posicin

10

10

10

10

10

BUSQUEDA BINARIA
VENTAJAS
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.

DESVENTAJAS
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 (xk,yk), obtener una funcin f que
verifique

f ( xk ) yk , k 1,..., n
a la que se denomina funcin interpolante de
dichos puntos. A los puntos xk se les llama
nodos.

ALGUNAS FORMAS DE
INTERPOLACION
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.

INTERPOLACION LINEAL

Uno de los mtodos de


interpolacin ms sencillos es el
lineal. En general, en la
interpolacin lineal se utilizan
dos puntos, (xa,ya) y (xb,yb), para
obtener
un
tercer
punto
interpolado (x,y) a partir de la
siguiente frmula:

( yb ya )
y ya ( x xa )
( xb xa )
La interpolacin lineal es rpida y
sencilla, pero no muy precisa.

BUSQUEDA POR
INTERPOLACION
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:

(key v[izq]) * (der izq)


p izq
(v[der ] v[izq])

BUSQUEDA POR
INTERPOLACION
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

(key v[izq]) * (der izq)


p izq
(v[der ] v[izq])

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

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.

BUSQUEDA INDEXADA
Necesita que los elementos
sobre los que se realiza la
bsqueda estn ordenados
de
acuerdo
a
una
determinada clave.

class ElemIndice{
private int clave;
private int posicion;

El mtodo utiliza un array


auxiliar denominado array
ndice.

public ElemIndice(int c, int p){


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

Cada objeto en el array


ndice consta de un valor y
la posicin que ocupa dicho
valor en el correspondiente
array ordenado:

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

10

14

16

19

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

CLAVE
POSICION

16

BUSQUEDA INDEXADA
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.
3

CLAVE
POSICION

16

10

14

16

19

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;
}
4
5
6
7
8
return arrayIndice; 3
}

CLAVE
POSICION

16

10

14

16

19

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

CONCLUSIONES DE
BUSQUEDA
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

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:
A1, A2, A3, ..., An
Se busca permutar estos elementos de tal forma
que los mismos queden de acuerdo con un orden
preestablecido.
Ascendente: A1 A2 A3 ... An
Descendente: A1 A2 A3 ... An

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:

(n 2):
Burbuja, Insercin, Seleccin.
(nlogn): Mezcla, Quicksort.
Otros:
Shell (n1.25).

ORDENAMIENTO INTERNO
Dividiremos los mtodos en
dos grandes grupos:

Directos (burbuja, seleccin


e insercin).

Logartmicos (Shell sort,


Merge sort, Heap sort, Quick
sort, Radix).

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.

En arreglos grandes las


ordenaciones
directas
resultan ineficientes y se
necesitara
un
mtodo
logartmico
para
su
solucin.

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

CLASIFICACIN POR SELECCIN


Deseamos ordenar las siguientes claves
de arreglo:

a:

15 67 08 16 44 27 12 35

menor= 15

i=1

15

67

8 16 44 27 12 35

67<15
8<15

Menor= 8
16<8
44<8
27<8
12<8
35<8

67 15

16 44 27 12 35

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


15 67 08 16 44 27 12 35
8

67 15

16 44 27 12 35

12 15

16 44 27 67 35

12 15

16 44 27 67 35

12 15

16 44 27 67 35

12 15

16 27 44 67 35

12 15

16 27 35 67 44

12 15

16 27 35 44 67

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:
n 1

t (n) ( (c1 c2 (c3 c 4(n i)) c5 c6))


i 1

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 peor
n 1

t (n) ( (c1 c2 (c3 (c 4 c7)(n i)) c5 c6))


i 1

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

c7

CLASIFICACIN POR SELECCIN


En el caso medio

( c 4 c 7)
t (n) ( (c1 c2 (c3
(n i)) c5 c6))
2
i 1
n 1

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


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

CLASIFICACIN POR SELECCIN


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

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

C (n 1) (n 2) ... 2 1
n2 n
C
2

n * (n 1)
2

CLASIFICACIN POR INTERCAMBIO


Ejemplo:
Arreglo con elementos: 15 67 08 16 44 27 12 35

Cuando i=0
A[ j ]>a[ j+1]

ARREGLO

15>67

15 67

67>8

8 16 44

27 12

35

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

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

CLASIFICACIN POR INTERCAMBIO


Ejemplo:
Arreglo con elementos: 15 67 08 16 44 27 12 35
Iteraciones
(i )

ARREGLO

15

8 16 44 27

12 35

67

15 16 27 12

35 44

67

15 16 12 27

35 44

67

15 12 16 27

35 44

67

12 15 16 27

35 44

67

12 15 16 27

35 44

67

12 15 16 27

35 44

67

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

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

es

de

complejidad

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

CLASIFICACIN POR INTERCAMBIO


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

C (n 1) (n 2) ... 2 1
n2 n
C
2

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

n * (n 1)
2

CLASIFICACIN POR INTERCAMBIO


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

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

CLASIFICACIN POR INSERCIN


Ejemplo:
Arreglo con elementos: 15 67 08 16 44 27 12 35

1ra. Pasada 15 67 08 16 44 27 12 35

2da. Pasada 08 15 67 16 44 27 12 35
3ra. Pasada 08 15 16 67 44 27 12 35
4ra. Pasada 08 15 16 44 67 27 12 35
5ta. Pasada 08 15 16 27 44 67 12 35

6ta. Pasada 08 12 15 16 27 44 67 35
7ma. Pasada 08 12 15 16 27 35 44 67

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

CLASIFICACIN POR INSERCIN


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:
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

CLASIFICACIN POR INSERCIN


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


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.

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

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
ji
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

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


GRUPOS DE 8

Pasada 1

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

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

CLASIFICACIN POR SHELL


GRUPOS DE 4
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

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

Pasada 2

07 10 15 21 08 16 44

27 12 28 56 36 13 35 60 67

07 10 15 21 08 16 44
08 21 15
16 15 21 44
12

27 12 28 56 36 13 35 60 67

27
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

CLASIFICACIN POR SHELL


GRUPOS DE 2
Pasada 3

Pasada 4

07 10 08 16 15 21 12
12 21 15

27 44 28 13 35 56 36 60 67
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
13

27
27

13 28 44 35 56 36 60 67
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


GRUPOS DE 1
Pasada 1

Pasada 2

Pasada 3

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
07 08 10 12 16 13 21 15 27
13 16 21
15 21 27

28 35 44

36 56 60 67

07 08 10 12 13 16 15 21 27

28 35 44
36 44 56 60 67
28 35 36 44 56 60 67

07 08 10 12 13 16 15 21 27
15 16 21 27
07 08 10 12 13 15 16 21 27

28 35
28 35
28 35

36 44 56 60 67
36 44 56 60 67
36 44 56 60 67

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.

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(n2), O(n3/2) y O(n4/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.

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

SECUENCIAS DE INCREMENTOS USADAS


POR SHELL
La propuesta por Hibbard: 2K-1, ..., 7, 3, 1;

Donde k se elije de modo tal que


2k-1 < n/2 y 2k+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(n5/4).
Una cota para el peor caso es del
O(n3/2).

f(1)=21-1=1
f(2)=22-1=3
f(3)=23-1=7

SECUENCIAS DE INCREMENTOS
USADAS POR SHELL

La propuesta por Sedgewick: g(i), f(i), ... , 41, 19, 5, 1;


Los incrementos de Sedgewick se
calculan intercalando los valores de las
siguientes funciones

f(0)=9(40)-9(20)+1=1
f(1)=9(41)-9(21)+1=19
f(2)=9(42)-9(22)+1=109

f (i) 9(4i ) 9(2i ) 1


g (i ) (2i 2 )(2i 2 3) 1

con la cual se pueden obtener tiempos


de ejecucin O(n4/3) para el peor caso y
O(n7/6) para el caso promedio

f(0)=(22)(22-3)+1=5
f(1)=(23)(23-3)+1=41
f(2)=(24)(24-3)+1=209

CLASIFICACIN POR
QUICKSORT
Este mtodo es el ms eficiente y veloz de los
mtodos de clasificacin.
Conocido
como
clasificacin
clasificacin por particin.

rpida

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.

CLASIFICACIN POR
QUICKSORT
pivote=42
0

42

89

63

12

94

27

78

50

36

42

36

63

12

94

27

78

50

89

42

36

12

94

27

78

63

50

89

42

36

12

27

94

78

63

50

89

27

36

12

42

94

78

63

50

89

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

funcion PARTICION(a, l, r) : entero


entero : pivot, i, j, t
pivot a[ l ].num
salir verdadero
i l+1
jr
mientras( salir) hacer
mientras( a[i].num pivot y i 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

CLASIFICACIN POR QUICKSORT


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]
X <= L[7]

(15 <= 35)


(15 <= 12)

Queda como sigue: 12

no hay intercambio
si hay intercambio

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)
X <= L[5] (15 <= 44)
X <= L[4] (15 <= 16)
X <= L[3] (15 <= 08)
Queda como sigue: 12 08 15 16

no hay intercambio
no hay intercambio
no hay intercambio
si hay intercambio
44 27 67 35

CLASIFICACIN POR QUICKSORT


Sea lo que deseamos clasificar. 15 67 08 16 44 27 12 35

1ra. Pasada 12 08 15 16 44 27 67 35
2da. Pasada 12 08 15 16 44 27 67 35
3ra. Pasada 12 08 15 16 35 27 44 67
4ra. Pasada 12 08 15 16 27 35 44 67
5ta. Pasada 08 12 15 16 27 35 44 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.

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:

C (n 1) 2 *

(n 1)
(n 1)
(n 1)
4*
... (n 1) *
2
4
(n 1)

C (n 1) (n 1) (n 1) ... (n 1)

Anlisis de la Clasificacin por Quicksort


Si el numero de trminos de la sumatoria es igual a m:

C (n 1) * m
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:

C (n 1) * log n

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
Caractersticas
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.

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
Montculos binarios

16

Un montculo Max es un rbol binario


completo
cuyos
elementos
estn
ordenados del siguiente modo:

14

10

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

10

16 14 10 8

10

El padre de A[8] es A[4]=8 donde


i=8, entonces 8/2=4

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
Se insertara

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)
Datos a ordenar:

25,

15,

20, 3,

5,

10

Se construye el rbol
25

15

20

10

25

15

20

10

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
k=6, Intercambiar nodo 0 con 5

25

15

20

10

10

resultado
2

15

20

25

25

15

20

10

10

15

20

25

ANTES

DESPUES

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
Revisar y recuperar la condicin de heap, sino
se cumple entre los nodos 0 y 4
10

15

resultado

15

20

25

20

15

10

10

25

20

25

resultado

20

10

15

25

CLASIFICACIN POR MONTICULOS


(HEAPSORT)

K= 5, Intercambiar nodo 0 con 4


20

resultado
1

15

10

25

15

10

20

25

20

10

15

25

15

10

20 25

ANTES

DESPUES

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
Revisar y recuperar la condicin de heap, sino
se cumple entre los nodos 0 y 3
5

15

resultado
1

15

10

20

25

10

20

25

15

10

20 25

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
K= 4, Intercambiar nodo 0 con 3
15

resultado
1

10

15

10

20

15

10

20 25

10

15 20 25

ANTES

25

20

DESPUES

25

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
Revisar y recuperar la condicin de heap, sino
se cumple entre los nodos 0 y 2
3

resultado
5

15

10

20

25

10

15

15

20

20

25

10

25

resultado

10

15 20 25

CLASIFICACIN POR MONTICULOS


(HEAPSORT)

K= 3, Intercambiar nodo 0 con 2


10

resultado

15

20

25

15

10

20

25

10

15 20 25

10

15 20 25

ANTES

DESPUES

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
Revisar y recuperar la condicin de
heap, sino se cumple entre los
nodos 0 y 1
5

resultado

15

10

20

25

Ya esta
ordenado!

15

10

20

25

10

15 20 25

CLASIFICACIN POR MONTICULOS


(HEAPSORT)
VENTAJAS
Su desempeo es en
promedio tan bueno como
el Quicksort y se comporta
mejor que este ltimo en
los peores casos.

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)
DESVENTAJAS
Aunque el Heapsort tiene un
mejor desempeo general que
cualquier
otro
mtodo
presentado de clasificacin
interna, es bastante complejo
de programar.

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

T (n) bT (n / c) f (n)

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


Ejemplo.
Arreglo a ordenar

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

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

Comparaciones para ordenar por


separado las parte derecha e
izquierda que son de tamao
[n/2] (b=2, c=2).

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

W (n) 2W ([n / 2]) (n 1)


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

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

Reuniendo en una sola expresin


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

si n 0
0
W ( n)
2W ([n / 2]) (n 1) si n 0

CLASIFICACIN POR MEZCLA


Como cualquiera de los algoritmos de ordenamiento
recursivo tiene complejidad logartmica: O(nlog2n).
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(nlog2n) 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

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

Digito menos
significativo

4567
Digito mas
significativo

REGLAS DEL
RADIX SORT

Arreglo original

12 92

33

25

86

57

37

48

0
1
2

12 92

33

PRIMERA PASADA
antes

4
5

25

86

57 37

48

12 92

33

25

86

57

37

48

33

25

86

57

37

48

despus

9
10

12 92

REGLAS DEL
RADIX SORT

SEGUNDA PASADA

antes
0
1

12

25

33 37

48

57

12 92

33

25

86

57

37

48

33

37

48

57

86

92

despus
12 25

7
8

86

92

10

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

PRIMERA PASADA

antes
0

120 80 30 20

241

12

3
4
5

6
7
8
9
10

20 12

120 30

80

241

despus
120

80

30

20 241 12

AJUSTES AL
RADIX SORT

SEGUNDA PASADA

antes
0
1

12

120 20

30

241

5
7
9
10

80

20

241 12

despus
12

6
8

120 80 30

120

20

30 241 80

AJUSTES AL
RADIX SORT

TERCERA PASADA

antes
0

012 020 030 080

120

241

3
4
5

12 120 20

30

241 80

despus
12

20

30

80 120 241

7
8
9
10

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.

DESVENTAJAS
DEL RADIX SORT
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

ORDENAMIENTO EXTERNO
CLASIFICACIN POR
MEZCLA DIRECTA
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
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.

CLASIFICACIN POR MEZCLA


DIRECTA
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

Resultado de la
primera pasada

CLASIFICACIN POR MEZCLA


DIRECTA
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

Resultado de la
tercera pasada

Fusin en secuencias de longitud 16.


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

YA ESTA
ORDENADO!

CLASIFICACIN EQUILIBRADA
ARCHIVO ORIGINAL
09 75 14 68 29 17 31 25 04 05 13 18 72 46 61

F1: 9, 75
F2: 14, 68

29
17, 31

FUSION : 9, 14, 68, 75

17, 29, 31

F1: 9, 14, 68, 75


F2: 17, 29, 31
FUSION

46 61

4, 5, 13, 18, 25, 72, 46, 61

4, 5, 13, 18, 25, 72


46, 61

9, 14, 17, 29, 31, 68, 75


F1:
F2:

FUSION

25
4, 5, 13, 18, 72

9 14 17 29 31 68 75
4 5 13 18 25 46 61 72

4, 5, 13, 18, 25, 46, 61, 72

YA ESTA
ORDENADO!

4, 5, 9, 13, 14, 17, 18, 25, 29, 31, 46, 61, 68, 72, 75

Laboratorio
Implementando los siguientes algoritmos
clasificacin en java o C++(en archivos):

de

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