SlideShare una empresa de Scribd logo
1 de 10
Descargar para leer sin conexión
Algoritmos de ordenamiento
Octavio Alberto Agust´ Aquino
ın
20 de diciembre de 2005

´
Indice
1. Introducci´n
o

1

2. M´todo de la burbuja
e

2

3. Inserci´n y selecci´n
o
o

3

4. Intercalaci´n
o

5

5. Ordenaci´n r´pida
o a

6

6. Mont´
ıculo

8

7. Conclusiones

9

1.

Introducci´n
o

El problema de la ordenaci´n es antiguo en lo que refiere al estudio de alo
goritmos y la computaci´n. Bien se puede decir que en estos casos “nada nuevo
o
hay bajo el Sol” pues muchas soluciones del problema son cl´sicas.
a
Dicho problema es com´nmente de la siguiente forma (o en muchos casos
u
puede reducirse a ´ste):
e
Entrada: Una sucesi´n de n n´meros A = {a1 , . . . , an }.
o
u
Salida: Una permutaci´n A = {a1 , . . . , an } de la secuencia original tal que
o
a1 ≤ . . . ≤ an .
Esencialmente, existen dos tipos de algoritmos de ordenamiento: los que dependen de comparaciones y cuyas complejidades se encuentran entre lo polinomial y lo logar´
ıtmico, y los de conteo, que asumen ciertas cosas sobre el conjunto
de datos y cuyos tiempos son lineales. Hablaremos sucintamente de cada caso
con sus correspondientes ejemplares m´s comunes, s´lo para los polinomiales y
a
o
logar´
ıtmicos.
Tambi´n es prudente aqu´ se˜alar el uso de la notaci´n O.
e
ı n
o
1
Definici´n 1 Para dos funciones f y g se dice que f es de orden g si existen
o
a, b ∈ Z+ tales que f (n) ≤ ag(n) para n ≥ b. Se escribe as´ que f es O(g(n)).
ı
Siempre se tomar´ la funci´n m´s sencilla posible que satisfaga la desigualdad
a
o
a
de la definici´n. As´ por ejemplo, si f (n) ≤ n2 , entonces se escribe simplemente
o
ı,
que f es O(n2 ), a pesar de que tambi´n f es O(2n2 ).
e
Otra forma de entender el orden es decir que la funci´n f est´ asint´ticao
a
o
mente acotada por g, es decir, que la gr´fica de f no sobrepasa a la de g a partir
a
de un cierto punto.
No es dif´ ver que la propiedad de orden en transitiva y aditiva, en el
ıcil
sentido de que la complejidad de una suma finita de funciones con un mismo
orden tiene el mismo orden que sus sumandos.

2.

M´todo de la burbuja
e

El m´todo de la burbuja es un ejemplo t´
e
ıpico de ordenaci´n por comparaci´n
o
o
de orden O(n2 ). El algoritmo es el siguiente. Se sigue denotando la sucesi´n de
o
datos por A, que en este caso se representa como un arreglo de enteros en C.
void burbuja(int *A, int n)
{
int i, j, temp;
for(i=0; i<n; i++)
{
for(j=0; j<n-1; j++)
{
if(A[j+1]<A[j])
{
temp=A[j+1];
A[j+1]=A[j];
A[j]=temp;
}
}
}
}
Dado que tenemos dos ciclos de n y n − 1 iteraciones es f´cil ver que el orden
a
de este algoritmo es O(n2 ). Su nombre es debido a que cada elemento del arreglo
A sube “burbujeando” hasta su lugar. Este algoritmo tiene la ventaja de que
ocupa poca memoria y no requiere mucho c´digo. Sin embargo, es demasiado
o
lento para conjuntos grandes de datos.
El m´todo de la burbuja puede mejorarse si “agitamos” de tal forma que no
e
solo los elementos m´s grandes del arreglo suban, sino tambi´n los m´s peque˜os
a
e
a
n
desciendan.
void agitar_burbuja(int *A, int A)
{
2
int cambio, ab, auf;
int izquierda=1;
int derecha=n;
int listo=derecha;
do
{
cambio=0;
for(ab=derecha; ab>=izquierda; ab--)
if(A[ab]<A[ab-1])
{
cambio=1; listo=ab;
temp=A[ab-1]
A[ab-1]=A[ab]; A[ab]=temp;
}
izquierda=listo+1;
for(auf=izquierda; auf<=derecha; auf++)
if(A[auf]<A[auf-1])
{
cambio=1; listo=auf;
temp=A[auf-1]
A[auf-1]=A[auf]; A[auf]=temp;
}
derecha=listo-1;
}while (cambio);
}

3.

Inserci´n y selecci´n
o
o

El ordenamiento por inserci´n funciona de la misma manera en la cual se
o
ordena la mano de una baraja. Se empieza con la mano izquierda vac´ y las
ıa
cartas cara abajo en la mesa. Entonces tomamos una carta a la vez de la mesa
y la insertamos en la posici´n correcta en la mano izquierda. Para encontrar la
o
posici´n correcta de la carta, la comparamos con cada una de las cartas que ya
o
se han colocado. El c´digo para este algoritmo es:
o
void insercion(int *A, int n)
{
int j, i, llave;
for(j=1; j<n; j++)
{
llave=A[j]; i=j-1;
while(i>0&&A[i]>llave)
{
A[i+1]=A[i];
i=i-1;
}
3
A[i+1]=llave;
}
}
n

En este caso hacemos i=1 i = 1 n(n − 1) comparaciones en el peor de los
2
casos. Este es un polinomio cuadr´tico, por lo que el orden del algoritmo es
a
O(n2 ).
Otra variante es la llamada selecci´n. En este caso encontramos primero
o
el elemento m´s peque˜o del conjunto y lo ponemos en la primera posici´n; a
a
n
o
continuaci´n se halla el segundo m´s peque˜o y se pone en segundo lugar, y
o
a
n
as´ sucesivamente. Por supuesto, el conjunto de datos con el que se trabaja se
ı
reduce cada vez, pues ya no hay que considerar los elementos ya ordenados. El
algoritmo ser´ el siguiente:
ıa
void seleccion(int *A, int n)
{
int j, i, llave;
for(i=0; i<n; i++)
for(j=n-1; j>i; j--)
if (A[j-1]>A[j])
{
llave=A[j-1];
A[j-1]=A[j];
A[j]=llave;
}
}
En este caso, para ordenar el elemento i-´simo del arreglo se tienen que
e
realizar n − i − 1 comparaciones en el peor de los casos. Al sumar se tienen
n−1
n
en total i=0 (n − i − 1) = i=1 (n − i) comparaciones, o lo que es lo mismo
n
n−1
1
i=1 (n − i) =
i=1 i = 2 n(n − 1) igual que del algoritmo anterior.
Otra manera de insertar es a trav´s de un ´rbol: se coloca el primer elemento
e
a
del arreglo en la ra´ y se agrega el siguiente elemento a la izquierda si es
ız,
menor que la ra´ o a la derecha en caso contrario. Continuando recursivamente,
ız
se obtiene un ´rbol que al recorrerse en orden devuelve el conjunto ordenado
a
de manera creciente. Se reproduce el procedimiento principal que construye el
a
´rbol.
void inserta(nodoapt *raiz, int num)
{
void agregader(nodoapt *, int);
void agregaizq(nodoapt *, int);
void inserta(nodoapt *, int);
if((*raiz)->info>num)
{
if((*raiz)->izq==NULL)
agregaizq(raiz, num);
4
else
inserta(&((*raiz)->izq), num);
}
else
{
if((*raiz)->der==NULL)
agregader(raiz, num);
else
inserta(&((*raiz)->der), num);
}
}
El peor de los casos ocurre cuando el conjunto est´ ordenado, pues entonces
a
realiza el mismo n´mero de comparaciones que los algoritmos anteriores, es
u
decir, es de orden O(n2 ). Sin embargo, si en el arreglo original los datos est´n
a
organizados de tal manera que la mitad de los n´meros anteriores a uno dado, a,
u
en el arreglo sean menores que a y la otra mitad mayores que a, resultan ´rboles
a
m´s balanceados. La profundidad p del ´rbol binario resultante no es inferior a
a
a
log2 (n + 1) − 1, y el n´mero de nodos en cualquier nivel, con excepci´n quiz´ del
u
o
a
ultimo, es 2l . El n´mero de comparaciones necesarias para llegar al nivel l = 0
´
u
p−1
es l + 1. Entonces el n´mero de comparaciones est´ entre p + l=1 2l (l + 1) y
u
a
p
l
l=1 2 (l + 1), sumas que nos indican que este algoritmo es de orden O(n log n),
en lo que se considera el caso promedio del algoritmo, pues en general no se
puede saber si un conjunto est´ ordenado o no.
a

4.

Intercalaci´n
o

La intercalaci´n es otro procedimiento recursivo que adem´s pertenece a los
o
a
del paradigma divide y vencer´s. Dicho paradigma se basa en tres pasos:
a
Dividir el problema en un cierto n´mero de subproblemas.
u
Vencer cada problema acudiendo al principio de divide y vencer´s nuevamente.
a
Si el problema ya es lo suficientemente f´cil, resolverlo de manera directa.
a
Combinar las soluciones parciales en la soluci´n global.
o
En el caso de la intercalaci´n esto ocurre de la manera siguiente:
o
Dividir: Partir el arreglo de n elementos en dos mitades.
Vencer: Ordenar los dos subarreglos con ordenamiento por intercalaci´n.
o
Combinar: Intercalar los dos subarreglos en forma ordenada para producir el
arreglo final ordenado.
El proceso debe llegar siempre a subarreglos de un elemento, pues ´stos ya
e
estan ordenados. El c´digo ser´ el siguiente.
o
a
5
void intercala (int *A, int l, int r)
{
int m;
void intercala(int *, int, int);
void combina(int *, int, int, int);
if (l<r)
{
m=(l+r)/2;
intercala(A, l, m);
intercala(A, m+1, r);
combina(A,l,m,r);
}
}
void combina(int *A, int l, int m, int r)
{
int i, j, k;
for(i=l, j=m, k=l; k<r; k++)
if ((j>=r)||((i<m)&&(A[i]<=A[j])))
A[k]=A[i++];
else
A[k]=A[j++];
}
Para los algoritmos divide y vencer´s el analisis de orden nos indica que,
a
de alcanzar la etapa “m´s simple” para ciertos c datos en cada recursi´n, sus
a
o
complejidades ser´n O(1). Para el orden OT del algoritmo global supongamos
a
OD es el orden de la divisi´n en k partes m´s peque˜as y OC el orden de la
o
a
n
reconstituci´n de la soluci´n total. Entonces
o
o

OT (n) =

O(1)
kOT ( n ) + OD (n) + OC (n)
k

O(1) si n ≤ c.
en cualquier otro caso.

(1)

Para el caso de la intercalaci´n tenemos:
o
OT (n) =

O(1)
2OT ( n ) + O(1)
2

si n = 1.
si n > 1.

Lo cual se reduce a que OT = O(n log n).

5.

Ordenaci´n r´pida
o a

Llamado tambi´n Quicksort (como si fuera una marca registrada o algo, no
e
veo la necesidad de no traducirlo), es un algoritmo introducido por C. A. R.
Hoare. Goza de gran popularidad por su orden logar´
ıtmico en promedio y su
superioridad frente a la intercalaci´n en el sentido de que no hay necesidad de
o
6
recombinar para obtener el resultado final. Es del tipo divide y vencer´s en este
a
modo:
Dividir: Partir el arreglo de dos partes A y A tales que para a ∈ A, a ∈ A ,
se tiene que a ≤ a .
Vencer: Ordernar los dos subarreglos con ordenaci´n r´pida.
o a
Combinar: No se necesita combinar dada la forma en la que se hizo la divisi´n..
o
Se implementa as´
ı:
void ordena_rapido(int *A, int l, int r)
{
int pivote;
int partir(int *, int, int, int);
if (l<r)
{
pivote=partir(A, l, r, r);
ordena_rapido(A, l, pivote-1);
ordena_rapido(A, pivote+1, r);
}
else
{
ordena_rapido(A, pivote+1, l);
ordena_rapido(A, l, pivote-1);
}
}
int partir(int *A, int l, int r, int pivote)
{
void cambiar(int &, int &);
int i=l-1;
int j=r;
int pivote=r;
cambiar(A[pivote], A[r]);
while(i<j)
{
do i++; while ((i<j)&&(A[i]<A[pivote]));
do j--; while ((j>i)&&(A[j]>A[pivote]));
if (i>=j)
cambiar(A[i],A[pivote]);
else
cambiar(A[i],A[j]);
}
return i;
}
7
void cambiar(int &a, int &b)
{
int temp=a; a=b; b=temp;
}
La funci´n partir funciona de este modo, despu´s de colocar un ´
o
e
ındice del
arreglo abajo i y otro arriba j y considerando al pivote:
1. Incrementar en una posici´n el indice inferior mientras sea inferior al indice
o
superior y al pivote.
2. Decrementar en una posici´n el indice superior mientras sea superior al
o
indice inferior y al pivote.
3. Si el indice inferior es superior al indice superior, entonces intercambiamos
el elemento inferior con el pivote, en caso contrario intercambiamos el
elemento inferior y el superior.
En el peor de los casos, en el cual la partici´n nos devuelve el conjunto menos
o
su ultimo elemento y su ultimo elemento como partici´n, seg´n (1) tenemos que
´
´
o
u
n
n
OT (n) = OT (n − 1) + O(n), y as´ OT (n) = k=1 O(k) = O( k=1 k) = O(n2 ),
ı
recordando lo dicho en la introducci´n sobre la aditividad de O.
o
En los casos regulares tenemos, al igual que en la intercalaci´n, que OT (n) =
o
O(n log n).

6.

Mont´
ıculo

La ordenaci´n por mont´
o
ıculo se sirve de la estructura del mismo nombre
y es de orden logar´
ıtmico. Es un arreglo que se comporta como un arbol binario completo bajo las relaciones padre(i) = i/2 , hijo izquierdo(i) = 2i,
hijo derecho(i) = 2i − 1, y que adem´s tiene la propiedad de mont´
a
ıculo, a saber, que A[padre(i)] ≥ A[i] en el caso de un mont´
ıculo ascendente, y viceversa
si es un mont´
ıculo descendente. En otras palabras, cada nodo padre es mayor
que sus hijos. Es f´cil ver que en cada caso que en la ra´ del mont´
a
ız
ıculo est´ el
a
elemento m´s grande del arreglo y que cada camino que conecta a las hojas con
a
la ra´ es una sucesi´n ordenada.
ız
o
El amontonamiento en una subrutina importante para manipular los mont´
ıculos. Sus entradas son un arreglo A y un ´
ındice i del arreglo. Al ejecutarse,
se asume que hijo izquierdo(i) e hijo derecho(i) son mont´
ıculos. Entonces el
amontonamiento reconstruye el submont´
ıculo con ra´ en i en caso de que no
ız
sea un mont´
ıculo.
Con el amontonamiento podemos convertir un arreglo en un mont´
ıculo. Puesto que los elementos A[ n/2 + 1], A[n] son hojas del ´rbol, ya son mont´
a
ıculos
y son punto de partida, desde donde amontonamos a todo A.
Para ordenar, tomamos la ra´ del mont´
ız
ıculo, la movemos a la ultima posi´
ci´n, reamontonamos el arreglo que queda despu´s de remover el ultimo elemento
o
e
´
8
y repetimos el procedimiento. Presentamos ahora el algoritmo de ordenaci´n por
o
mont´
ıculo.
void monticulo(int *A, int len)
{
void cambiar(int &, int &);
void amontonar(int *, int, int);
int i; int l;
for (i=len-1; i>=0; i--)
amontonar(A, len, i);
for (l=len-1; l>=1; l--)
{
cambiar(A[0], A[l]);
amontonar(A,l,0);
}
}
void amontonar(int *A, int len, int r)
{
int i=r;
int j=2*r+1;
while (j<len)
{
if((j+1<len)&&(A[j+1]>A[j])) j++;
if(A[j]>A[i])
{
cambiar(A[i],A[j]);
i=j;
j=2*j+1;
}
else break;
}
}
void cambiar(int &a, int &b)
{
int temp=a; a=b; b=temp;
}
La complejidad de la primera parte del algoritmo es O(n), y la del amontonamiento, que obedece a OT (n) ≤ OT (2n/3) + O(1) = O(log n). Luego, el orden
del mont´
ıculo es O(n log n).

9
7.

Conclusiones

El tema de las ordenaciones es muy interesante desde el punto de vista
matem´tico y computacional. Tiene su aplicaci´n en la vida diaria cuando se
a
o
tienen que ordenar cosas como fichas de un directorio personal, publicaciones
peri´dicas por fecha, o p´ginas fotocopiadas que est´n en desorden. Sin duda esto
o
a
a
adquiere mayor importancia ahora que las personas manejamos vol´menes de
u
informaci´n cada vez m´s grandes dada la revoluci´n en las telecomunicaciones.
o
a
o

Referencias
[1] CORMEN, Thomas et al. Introduction to algorithms. MIT Press-McGrawHill, USA, 1996.
[2] TENENBAUM, Aaron et al. Estructuras de datos en C. Prentice-Hall Hispanoamericana. M´xico, 1993.
e
[3] HEUN, Volker. Grundlangen Algorithmen. Vieweg & Sohn. Alemania, 2001.
[4] SOLYMOSI, Andreas. Grundkurs Algorithmen und Datenstrukturen. Vieweg
& Sohn. Alemania, 2001.

10

Más contenido relacionado

La actualidad más candente

Continuidad de Funciones
Continuidad de FuncionesContinuidad de Funciones
Continuidad de FuncionesKike Prieto
 
68908191 ejercicios-resueltos-derivacion
68908191 ejercicios-resueltos-derivacion68908191 ejercicios-resueltos-derivacion
68908191 ejercicios-resueltos-derivacionmilico
 
Definicion de antiderivadas victor
Definicion de antiderivadas victorDefinicion de antiderivadas victor
Definicion de antiderivadas victorVICTORMSABE
 
PDS Unidad 2 Sección 2.4: Respuesta de sistemas discretos
PDS Unidad 2 Sección 2.4: Respuesta de sistemas discretosPDS Unidad 2 Sección 2.4: Respuesta de sistemas discretos
PDS Unidad 2 Sección 2.4: Respuesta de sistemas discretosJuan Palacios
 
11 maximos y minimos
11 maximos y minimos11 maximos y minimos
11 maximos y minimosalex
 
Sección 2.7 Correlación de señales discretas en el tiempo
Sección 2.7 Correlación de señales discretas en el tiempoSección 2.7 Correlación de señales discretas en el tiempo
Sección 2.7 Correlación de señales discretas en el tiempoJuan Palacios
 
Aplicacion de la derivada
Aplicacion de la derivadaAplicacion de la derivada
Aplicacion de la derivadayicel abella
 
Ejercicios detallados del obj 3 mat i (175 176-177
Ejercicios detallados del obj 3 mat i (175 176-177Ejercicios detallados del obj 3 mat i (175 176-177
Ejercicios detallados del obj 3 mat i (175 176-177Jonathan Mejías
 
Identidades trigonometricas
Identidades trigonometricasIdentidades trigonometricas
Identidades trigonometricashugue1077
 
PDS Unidad 2 Sección 2.2: Representación de sistemas discretos con diagrama a...
PDS Unidad 2 Sección 2.2: Representación de sistemas discretos con diagrama a...PDS Unidad 2 Sección 2.2: Representación de sistemas discretos con diagrama a...
PDS Unidad 2 Sección 2.2: Representación de sistemas discretos con diagrama a...Juan Palacios
 
Analisis libro gerardo____5toao
Analisis libro gerardo____5toaoAnalisis libro gerardo____5toao
Analisis libro gerardo____5toaoOmar Hernandez
 
Regla de la cadena para la anti-derivada.
Regla de la cadena para la anti-derivada.Regla de la cadena para la anti-derivada.
Regla de la cadena para la anti-derivada.Rosa Puga
 
PDS Unidad 2, Sección 2.1: Sistemas en tiempo discreto
PDS Unidad 2, Sección 2.1: Sistemas en tiempo discretoPDS Unidad 2, Sección 2.1: Sistemas en tiempo discreto
PDS Unidad 2, Sección 2.1: Sistemas en tiempo discretoJuan Palacios
 
Límite y continuidad de una función
Límite y continuidad de una funciónLímite y continuidad de una función
Límite y continuidad de una funciónMarianoHernandez27
 

La actualidad más candente (16)

Identidades trigonometricas
Identidades trigonometricasIdentidades trigonometricas
Identidades trigonometricas
 
Continuidad de Funciones
Continuidad de FuncionesContinuidad de Funciones
Continuidad de Funciones
 
68908191 ejercicios-resueltos-derivacion
68908191 ejercicios-resueltos-derivacion68908191 ejercicios-resueltos-derivacion
68908191 ejercicios-resueltos-derivacion
 
Identidades trigonometricas
Identidades trigonometricasIdentidades trigonometricas
Identidades trigonometricas
 
Definicion de antiderivadas victor
Definicion de antiderivadas victorDefinicion de antiderivadas victor
Definicion de antiderivadas victor
 
PDS Unidad 2 Sección 2.4: Respuesta de sistemas discretos
PDS Unidad 2 Sección 2.4: Respuesta de sistemas discretosPDS Unidad 2 Sección 2.4: Respuesta de sistemas discretos
PDS Unidad 2 Sección 2.4: Respuesta de sistemas discretos
 
11 maximos y minimos
11 maximos y minimos11 maximos y minimos
11 maximos y minimos
 
Sección 2.7 Correlación de señales discretas en el tiempo
Sección 2.7 Correlación de señales discretas en el tiempoSección 2.7 Correlación de señales discretas en el tiempo
Sección 2.7 Correlación de señales discretas en el tiempo
 
Aplicacion de la derivada
Aplicacion de la derivadaAplicacion de la derivada
Aplicacion de la derivada
 
Ejercicios detallados del obj 3 mat i (175 176-177
Ejercicios detallados del obj 3 mat i (175 176-177Ejercicios detallados del obj 3 mat i (175 176-177
Ejercicios detallados del obj 3 mat i (175 176-177
 
Identidades trigonometricas
Identidades trigonometricasIdentidades trigonometricas
Identidades trigonometricas
 
PDS Unidad 2 Sección 2.2: Representación de sistemas discretos con diagrama a...
PDS Unidad 2 Sección 2.2: Representación de sistemas discretos con diagrama a...PDS Unidad 2 Sección 2.2: Representación de sistemas discretos con diagrama a...
PDS Unidad 2 Sección 2.2: Representación de sistemas discretos con diagrama a...
 
Analisis libro gerardo____5toao
Analisis libro gerardo____5toaoAnalisis libro gerardo____5toao
Analisis libro gerardo____5toao
 
Regla de la cadena para la anti-derivada.
Regla de la cadena para la anti-derivada.Regla de la cadena para la anti-derivada.
Regla de la cadena para la anti-derivada.
 
PDS Unidad 2, Sección 2.1: Sistemas en tiempo discreto
PDS Unidad 2, Sección 2.1: Sistemas en tiempo discretoPDS Unidad 2, Sección 2.1: Sistemas en tiempo discreto
PDS Unidad 2, Sección 2.1: Sistemas en tiempo discreto
 
Límite y continuidad de una función
Límite y continuidad de una funciónLímite y continuidad de una función
Límite y continuidad de una función
 

Similar a Ordenamiento

Jflambert lyada - ayudantia matematicas discretas
Jflambert   lyada - ayudantia matematicas discretasJflambert   lyada - ayudantia matematicas discretas
Jflambert lyada - ayudantia matematicas discretasFrancisco Lambert Obediente
 
Jflambert lyada - ayudantia ordenamiento y teo maestro
Jflambert   lyada - ayudantia ordenamiento y teo maestroJflambert   lyada - ayudantia ordenamiento y teo maestro
Jflambert lyada - ayudantia ordenamiento y teo maestroFrancisco Lambert Obediente
 
Algoritmos de ordenamiento
Algoritmos de ordenamientoAlgoritmos de ordenamiento
Algoritmos de ordenamientoOrlando Torres
 
Mpinning Gyalg13(Recurr)
Mpinning Gyalg13(Recurr)Mpinning Gyalg13(Recurr)
Mpinning Gyalg13(Recurr)Spimy
 
Metodos de ordenamiento
Metodos de ordenamientoMetodos de ordenamiento
Metodos de ordenamientoLalo Chooper
 
Mpinning Gy Alg9(Conteo)
Mpinning Gy Alg9(Conteo)Mpinning Gy Alg9(Conteo)
Mpinning Gy Alg9(Conteo)Spimy
 
Presentacion TEMA 1 INTEGRALES- CARLOS PÉREZ Y ANDRES VEROES.pdf
Presentacion TEMA 1 INTEGRALES- CARLOS PÉREZ Y ANDRES VEROES.pdfPresentacion TEMA 1 INTEGRALES- CARLOS PÉREZ Y ANDRES VEROES.pdf
Presentacion TEMA 1 INTEGRALES- CARLOS PÉREZ Y ANDRES VEROES.pdfCarlosPrez863239
 
Analisis Clase2
Analisis  Clase2Analisis  Clase2
Analisis Clase2luzenith_g
 
metodosdeordenamiento.pptx
metodosdeordenamiento.pptxmetodosdeordenamiento.pptx
metodosdeordenamiento.pptxLeydiCardona3
 
Métodos de eliminación numerica
Métodos de eliminación numericaMétodos de eliminación numerica
Métodos de eliminación numericajose duran
 
Ecuaciones lineales
Ecuaciones linealesEcuaciones lineales
Ecuaciones linealesJesusS14
 
82 apm dominio-de_
82 apm dominio-de_82 apm dominio-de_
82 apm dominio-de_gacego
 
82 apm dominio-de_ (1)
82 apm dominio-de_ (1)82 apm dominio-de_ (1)
82 apm dominio-de_ (1)gacego
 
82 apm dominio-de_ (2)
82 apm dominio-de_ (2)82 apm dominio-de_ (2)
82 apm dominio-de_ (2)gacego
 
82 apm dominio-de_ (1)
82 apm dominio-de_ (1)82 apm dominio-de_ (1)
82 apm dominio-de_ (1)gacego
 
sistemas_lineales_Print_I2020.pdf
sistemas_lineales_Print_I2020.pdfsistemas_lineales_Print_I2020.pdf
sistemas_lineales_Print_I2020.pdfjorge816356
 

Similar a Ordenamiento (20)

Divide y Venceras
Divide y VencerasDivide y Venceras
Divide y Venceras
 
Jflambert lyada - ayudantia matematicas discretas
Jflambert   lyada - ayudantia matematicas discretasJflambert   lyada - ayudantia matematicas discretas
Jflambert lyada - ayudantia matematicas discretas
 
Jflambert lyada - ayudantia ordenamiento y teo maestro
Jflambert   lyada - ayudantia ordenamiento y teo maestroJflambert   lyada - ayudantia ordenamiento y teo maestro
Jflambert lyada - ayudantia ordenamiento y teo maestro
 
Algoritmos de ordenamiento
Algoritmos de ordenamientoAlgoritmos de ordenamiento
Algoritmos de ordenamiento
 
Mpinning Gyalg13(Recurr)
Mpinning Gyalg13(Recurr)Mpinning Gyalg13(Recurr)
Mpinning Gyalg13(Recurr)
 
Metodos de ordenamiento
Metodos de ordenamientoMetodos de ordenamiento
Metodos de ordenamiento
 
Informe
InformeInforme
Informe
 
Mpinning Gy Alg9(Conteo)
Mpinning Gy Alg9(Conteo)Mpinning Gy Alg9(Conteo)
Mpinning Gy Alg9(Conteo)
 
Unidad 2
Unidad 2Unidad 2
Unidad 2
 
Presentacion TEMA 1 INTEGRALES- CARLOS PÉREZ Y ANDRES VEROES.pdf
Presentacion TEMA 1 INTEGRALES- CARLOS PÉREZ Y ANDRES VEROES.pdfPresentacion TEMA 1 INTEGRALES- CARLOS PÉREZ Y ANDRES VEROES.pdf
Presentacion TEMA 1 INTEGRALES- CARLOS PÉREZ Y ANDRES VEROES.pdf
 
Analisis Clase2
Analisis  Clase2Analisis  Clase2
Analisis Clase2
 
metodosdeordenamiento.pptx
metodosdeordenamiento.pptxmetodosdeordenamiento.pptx
metodosdeordenamiento.pptx
 
Metodos de ordenamiento
Metodos de ordenamientoMetodos de ordenamiento
Metodos de ordenamiento
 
Métodos de eliminación numerica
Métodos de eliminación numericaMétodos de eliminación numerica
Métodos de eliminación numerica
 
Ecuaciones lineales
Ecuaciones linealesEcuaciones lineales
Ecuaciones lineales
 
82 apm dominio-de_
82 apm dominio-de_82 apm dominio-de_
82 apm dominio-de_
 
82 apm dominio-de_ (1)
82 apm dominio-de_ (1)82 apm dominio-de_ (1)
82 apm dominio-de_ (1)
 
82 apm dominio-de_ (2)
82 apm dominio-de_ (2)82 apm dominio-de_ (2)
82 apm dominio-de_ (2)
 
82 apm dominio-de_ (1)
82 apm dominio-de_ (1)82 apm dominio-de_ (1)
82 apm dominio-de_ (1)
 
sistemas_lineales_Print_I2020.pdf
sistemas_lineales_Print_I2020.pdfsistemas_lineales_Print_I2020.pdf
sistemas_lineales_Print_I2020.pdf
 

Más de von Pereira

doc256_introduccion-a-la-mecanica-de-fluidos.PDF
doc256_introduccion-a-la-mecanica-de-fluidos.PDFdoc256_introduccion-a-la-mecanica-de-fluidos.PDF
doc256_introduccion-a-la-mecanica-de-fluidos.PDFvon Pereira
 
tesis_n1353_Gratton.pdf
tesis_n1353_Gratton.pdftesis_n1353_Gratton.pdf
tesis_n1353_Gratton.pdfvon Pereira
 
termodinamica-graton.pdf
termodinamica-graton.pdftermodinamica-graton.pdf
termodinamica-graton.pdfvon Pereira
 
Julio Gratton.docx
Julio Gratton.docxJulio Gratton.docx
Julio Gratton.docxvon Pereira
 
Tesismaestria oaaa
Tesismaestria oaaaTesismaestria oaaa
Tesismaestria oaaavon Pereira
 
Pres geometria prehispanica
Pres geometria prehispanicaPres geometria prehispanica
Pres geometria prehispanicavon Pereira
 
Jim03proyectogrado
Jim03proyectogradoJim03proyectogrado
Jim03proyectogradovon Pereira
 
Ensayo estrategias aprendizaje
Ensayo estrategias aprendizajeEnsayo estrategias aprendizaje
Ensayo estrategias aprendizajevon Pereira
 
Tesis doctorado oaaa
Tesis doctorado oaaaTesis doctorado oaaa
Tesis doctorado oaaavon Pereira
 

Más de von Pereira (14)

doc256_introduccion-a-la-mecanica-de-fluidos.PDF
doc256_introduccion-a-la-mecanica-de-fluidos.PDFdoc256_introduccion-a-la-mecanica-de-fluidos.PDF
doc256_introduccion-a-la-mecanica-de-fluidos.PDF
 
tesis_n1353_Gratton.pdf
tesis_n1353_Gratton.pdftesis_n1353_Gratton.pdf
tesis_n1353_Gratton.pdf
 
termodinamica-graton.pdf
termodinamica-graton.pdftermodinamica-graton.pdf
termodinamica-graton.pdf
 
Julio Gratton.docx
Julio Gratton.docxJulio Gratton.docx
Julio Gratton.docx
 
Tesismaestria oaaa
Tesismaestria oaaaTesismaestria oaaa
Tesismaestria oaaa
 
Preslibro
PreslibroPreslibro
Preslibro
 
Pres musica
Pres musicaPres musica
Pres musica
 
Pres geometria prehispanica
Pres geometria prehispanicaPres geometria prehispanica
Pres geometria prehispanica
 
K3 3
K3 3K3 3
K3 3
 
Jim03proyectogrado
Jim03proyectogradoJim03proyectogrado
Jim03proyectogrado
 
Fc
FcFc
Fc
 
Ensayo estrategias aprendizaje
Ensayo estrategias aprendizajeEnsayo estrategias aprendizaje
Ensayo estrategias aprendizaje
 
Tesis doctorado oaaa
Tesis doctorado oaaaTesis doctorado oaaa
Tesis doctorado oaaa
 
131
131131
131
 

Ordenamiento

  • 1. Algoritmos de ordenamiento Octavio Alberto Agust´ Aquino ın 20 de diciembre de 2005 ´ Indice 1. Introducci´n o 1 2. M´todo de la burbuja e 2 3. Inserci´n y selecci´n o o 3 4. Intercalaci´n o 5 5. Ordenaci´n r´pida o a 6 6. Mont´ ıculo 8 7. Conclusiones 9 1. Introducci´n o El problema de la ordenaci´n es antiguo en lo que refiere al estudio de alo goritmos y la computaci´n. Bien se puede decir que en estos casos “nada nuevo o hay bajo el Sol” pues muchas soluciones del problema son cl´sicas. a Dicho problema es com´nmente de la siguiente forma (o en muchos casos u puede reducirse a ´ste): e Entrada: Una sucesi´n de n n´meros A = {a1 , . . . , an }. o u Salida: Una permutaci´n A = {a1 , . . . , an } de la secuencia original tal que o a1 ≤ . . . ≤ an . Esencialmente, existen dos tipos de algoritmos de ordenamiento: los que dependen de comparaciones y cuyas complejidades se encuentran entre lo polinomial y lo logar´ ıtmico, y los de conteo, que asumen ciertas cosas sobre el conjunto de datos y cuyos tiempos son lineales. Hablaremos sucintamente de cada caso con sus correspondientes ejemplares m´s comunes, s´lo para los polinomiales y a o logar´ ıtmicos. Tambi´n es prudente aqu´ se˜alar el uso de la notaci´n O. e ı n o 1
  • 2. Definici´n 1 Para dos funciones f y g se dice que f es de orden g si existen o a, b ∈ Z+ tales que f (n) ≤ ag(n) para n ≥ b. Se escribe as´ que f es O(g(n)). ı Siempre se tomar´ la funci´n m´s sencilla posible que satisfaga la desigualdad a o a de la definici´n. As´ por ejemplo, si f (n) ≤ n2 , entonces se escribe simplemente o ı, que f es O(n2 ), a pesar de que tambi´n f es O(2n2 ). e Otra forma de entender el orden es decir que la funci´n f est´ asint´ticao a o mente acotada por g, es decir, que la gr´fica de f no sobrepasa a la de g a partir a de un cierto punto. No es dif´ ver que la propiedad de orden en transitiva y aditiva, en el ıcil sentido de que la complejidad de una suma finita de funciones con un mismo orden tiene el mismo orden que sus sumandos. 2. M´todo de la burbuja e El m´todo de la burbuja es un ejemplo t´ e ıpico de ordenaci´n por comparaci´n o o de orden O(n2 ). El algoritmo es el siguiente. Se sigue denotando la sucesi´n de o datos por A, que en este caso se representa como un arreglo de enteros en C. void burbuja(int *A, int n) { int i, j, temp; for(i=0; i<n; i++) { for(j=0; j<n-1; j++) { if(A[j+1]<A[j]) { temp=A[j+1]; A[j+1]=A[j]; A[j]=temp; } } } } Dado que tenemos dos ciclos de n y n − 1 iteraciones es f´cil ver que el orden a de este algoritmo es O(n2 ). Su nombre es debido a que cada elemento del arreglo A sube “burbujeando” hasta su lugar. Este algoritmo tiene la ventaja de que ocupa poca memoria y no requiere mucho c´digo. Sin embargo, es demasiado o lento para conjuntos grandes de datos. El m´todo de la burbuja puede mejorarse si “agitamos” de tal forma que no e solo los elementos m´s grandes del arreglo suban, sino tambi´n los m´s peque˜os a e a n desciendan. void agitar_burbuja(int *A, int A) { 2
  • 3. int cambio, ab, auf; int izquierda=1; int derecha=n; int listo=derecha; do { cambio=0; for(ab=derecha; ab>=izquierda; ab--) if(A[ab]<A[ab-1]) { cambio=1; listo=ab; temp=A[ab-1] A[ab-1]=A[ab]; A[ab]=temp; } izquierda=listo+1; for(auf=izquierda; auf<=derecha; auf++) if(A[auf]<A[auf-1]) { cambio=1; listo=auf; temp=A[auf-1] A[auf-1]=A[auf]; A[auf]=temp; } derecha=listo-1; }while (cambio); } 3. Inserci´n y selecci´n o o El ordenamiento por inserci´n funciona de la misma manera en la cual se o ordena la mano de una baraja. Se empieza con la mano izquierda vac´ y las ıa cartas cara abajo en la mesa. Entonces tomamos una carta a la vez de la mesa y la insertamos en la posici´n correcta en la mano izquierda. Para encontrar la o posici´n correcta de la carta, la comparamos con cada una de las cartas que ya o se han colocado. El c´digo para este algoritmo es: o void insercion(int *A, int n) { int j, i, llave; for(j=1; j<n; j++) { llave=A[j]; i=j-1; while(i>0&&A[i]>llave) { A[i+1]=A[i]; i=i-1; } 3
  • 4. A[i+1]=llave; } } n En este caso hacemos i=1 i = 1 n(n − 1) comparaciones en el peor de los 2 casos. Este es un polinomio cuadr´tico, por lo que el orden del algoritmo es a O(n2 ). Otra variante es la llamada selecci´n. En este caso encontramos primero o el elemento m´s peque˜o del conjunto y lo ponemos en la primera posici´n; a a n o continuaci´n se halla el segundo m´s peque˜o y se pone en segundo lugar, y o a n as´ sucesivamente. Por supuesto, el conjunto de datos con el que se trabaja se ı reduce cada vez, pues ya no hay que considerar los elementos ya ordenados. El algoritmo ser´ el siguiente: ıa void seleccion(int *A, int n) { int j, i, llave; for(i=0; i<n; i++) for(j=n-1; j>i; j--) if (A[j-1]>A[j]) { llave=A[j-1]; A[j-1]=A[j]; A[j]=llave; } } En este caso, para ordenar el elemento i-´simo del arreglo se tienen que e realizar n − i − 1 comparaciones en el peor de los casos. Al sumar se tienen n−1 n en total i=0 (n − i − 1) = i=1 (n − i) comparaciones, o lo que es lo mismo n n−1 1 i=1 (n − i) = i=1 i = 2 n(n − 1) igual que del algoritmo anterior. Otra manera de insertar es a trav´s de un ´rbol: se coloca el primer elemento e a del arreglo en la ra´ y se agrega el siguiente elemento a la izquierda si es ız, menor que la ra´ o a la derecha en caso contrario. Continuando recursivamente, ız se obtiene un ´rbol que al recorrerse en orden devuelve el conjunto ordenado a de manera creciente. Se reproduce el procedimiento principal que construye el a ´rbol. void inserta(nodoapt *raiz, int num) { void agregader(nodoapt *, int); void agregaizq(nodoapt *, int); void inserta(nodoapt *, int); if((*raiz)->info>num) { if((*raiz)->izq==NULL) agregaizq(raiz, num); 4
  • 5. else inserta(&((*raiz)->izq), num); } else { if((*raiz)->der==NULL) agregader(raiz, num); else inserta(&((*raiz)->der), num); } } El peor de los casos ocurre cuando el conjunto est´ ordenado, pues entonces a realiza el mismo n´mero de comparaciones que los algoritmos anteriores, es u decir, es de orden O(n2 ). Sin embargo, si en el arreglo original los datos est´n a organizados de tal manera que la mitad de los n´meros anteriores a uno dado, a, u en el arreglo sean menores que a y la otra mitad mayores que a, resultan ´rboles a m´s balanceados. La profundidad p del ´rbol binario resultante no es inferior a a a log2 (n + 1) − 1, y el n´mero de nodos en cualquier nivel, con excepci´n quiz´ del u o a ultimo, es 2l . El n´mero de comparaciones necesarias para llegar al nivel l = 0 ´ u p−1 es l + 1. Entonces el n´mero de comparaciones est´ entre p + l=1 2l (l + 1) y u a p l l=1 2 (l + 1), sumas que nos indican que este algoritmo es de orden O(n log n), en lo que se considera el caso promedio del algoritmo, pues en general no se puede saber si un conjunto est´ ordenado o no. a 4. Intercalaci´n o La intercalaci´n es otro procedimiento recursivo que adem´s pertenece a los o a del paradigma divide y vencer´s. Dicho paradigma se basa en tres pasos: a Dividir el problema en un cierto n´mero de subproblemas. u Vencer cada problema acudiendo al principio de divide y vencer´s nuevamente. a Si el problema ya es lo suficientemente f´cil, resolverlo de manera directa. a Combinar las soluciones parciales en la soluci´n global. o En el caso de la intercalaci´n esto ocurre de la manera siguiente: o Dividir: Partir el arreglo de n elementos en dos mitades. Vencer: Ordenar los dos subarreglos con ordenamiento por intercalaci´n. o Combinar: Intercalar los dos subarreglos en forma ordenada para producir el arreglo final ordenado. El proceso debe llegar siempre a subarreglos de un elemento, pues ´stos ya e estan ordenados. El c´digo ser´ el siguiente. o a 5
  • 6. void intercala (int *A, int l, int r) { int m; void intercala(int *, int, int); void combina(int *, int, int, int); if (l<r) { m=(l+r)/2; intercala(A, l, m); intercala(A, m+1, r); combina(A,l,m,r); } } void combina(int *A, int l, int m, int r) { int i, j, k; for(i=l, j=m, k=l; k<r; k++) if ((j>=r)||((i<m)&&(A[i]<=A[j]))) A[k]=A[i++]; else A[k]=A[j++]; } Para los algoritmos divide y vencer´s el analisis de orden nos indica que, a de alcanzar la etapa “m´s simple” para ciertos c datos en cada recursi´n, sus a o complejidades ser´n O(1). Para el orden OT del algoritmo global supongamos a OD es el orden de la divisi´n en k partes m´s peque˜as y OC el orden de la o a n reconstituci´n de la soluci´n total. Entonces o o OT (n) = O(1) kOT ( n ) + OD (n) + OC (n) k O(1) si n ≤ c. en cualquier otro caso. (1) Para el caso de la intercalaci´n tenemos: o OT (n) = O(1) 2OT ( n ) + O(1) 2 si n = 1. si n > 1. Lo cual se reduce a que OT = O(n log n). 5. Ordenaci´n r´pida o a Llamado tambi´n Quicksort (como si fuera una marca registrada o algo, no e veo la necesidad de no traducirlo), es un algoritmo introducido por C. A. R. Hoare. Goza de gran popularidad por su orden logar´ ıtmico en promedio y su superioridad frente a la intercalaci´n en el sentido de que no hay necesidad de o 6
  • 7. recombinar para obtener el resultado final. Es del tipo divide y vencer´s en este a modo: Dividir: Partir el arreglo de dos partes A y A tales que para a ∈ A, a ∈ A , se tiene que a ≤ a . Vencer: Ordernar los dos subarreglos con ordenaci´n r´pida. o a Combinar: No se necesita combinar dada la forma en la que se hizo la divisi´n.. o Se implementa as´ ı: void ordena_rapido(int *A, int l, int r) { int pivote; int partir(int *, int, int, int); if (l<r) { pivote=partir(A, l, r, r); ordena_rapido(A, l, pivote-1); ordena_rapido(A, pivote+1, r); } else { ordena_rapido(A, pivote+1, l); ordena_rapido(A, l, pivote-1); } } int partir(int *A, int l, int r, int pivote) { void cambiar(int &, int &); int i=l-1; int j=r; int pivote=r; cambiar(A[pivote], A[r]); while(i<j) { do i++; while ((i<j)&&(A[i]<A[pivote])); do j--; while ((j>i)&&(A[j]>A[pivote])); if (i>=j) cambiar(A[i],A[pivote]); else cambiar(A[i],A[j]); } return i; } 7
  • 8. void cambiar(int &a, int &b) { int temp=a; a=b; b=temp; } La funci´n partir funciona de este modo, despu´s de colocar un ´ o e ındice del arreglo abajo i y otro arriba j y considerando al pivote: 1. Incrementar en una posici´n el indice inferior mientras sea inferior al indice o superior y al pivote. 2. Decrementar en una posici´n el indice superior mientras sea superior al o indice inferior y al pivote. 3. Si el indice inferior es superior al indice superior, entonces intercambiamos el elemento inferior con el pivote, en caso contrario intercambiamos el elemento inferior y el superior. En el peor de los casos, en el cual la partici´n nos devuelve el conjunto menos o su ultimo elemento y su ultimo elemento como partici´n, seg´n (1) tenemos que ´ ´ o u n n OT (n) = OT (n − 1) + O(n), y as´ OT (n) = k=1 O(k) = O( k=1 k) = O(n2 ), ı recordando lo dicho en la introducci´n sobre la aditividad de O. o En los casos regulares tenemos, al igual que en la intercalaci´n, que OT (n) = o O(n log n). 6. Mont´ ıculo La ordenaci´n por mont´ o ıculo se sirve de la estructura del mismo nombre y es de orden logar´ ıtmico. Es un arreglo que se comporta como un arbol binario completo bajo las relaciones padre(i) = i/2 , hijo izquierdo(i) = 2i, hijo derecho(i) = 2i − 1, y que adem´s tiene la propiedad de mont´ a ıculo, a saber, que A[padre(i)] ≥ A[i] en el caso de un mont´ ıculo ascendente, y viceversa si es un mont´ ıculo descendente. En otras palabras, cada nodo padre es mayor que sus hijos. Es f´cil ver que en cada caso que en la ra´ del mont´ a ız ıculo est´ el a elemento m´s grande del arreglo y que cada camino que conecta a las hojas con a la ra´ es una sucesi´n ordenada. ız o El amontonamiento en una subrutina importante para manipular los mont´ ıculos. Sus entradas son un arreglo A y un ´ ındice i del arreglo. Al ejecutarse, se asume que hijo izquierdo(i) e hijo derecho(i) son mont´ ıculos. Entonces el amontonamiento reconstruye el submont´ ıculo con ra´ en i en caso de que no ız sea un mont´ ıculo. Con el amontonamiento podemos convertir un arreglo en un mont´ ıculo. Puesto que los elementos A[ n/2 + 1], A[n] son hojas del ´rbol, ya son mont´ a ıculos y son punto de partida, desde donde amontonamos a todo A. Para ordenar, tomamos la ra´ del mont´ ız ıculo, la movemos a la ultima posi´ ci´n, reamontonamos el arreglo que queda despu´s de remover el ultimo elemento o e ´ 8
  • 9. y repetimos el procedimiento. Presentamos ahora el algoritmo de ordenaci´n por o mont´ ıculo. void monticulo(int *A, int len) { void cambiar(int &, int &); void amontonar(int *, int, int); int i; int l; for (i=len-1; i>=0; i--) amontonar(A, len, i); for (l=len-1; l>=1; l--) { cambiar(A[0], A[l]); amontonar(A,l,0); } } void amontonar(int *A, int len, int r) { int i=r; int j=2*r+1; while (j<len) { if((j+1<len)&&(A[j+1]>A[j])) j++; if(A[j]>A[i]) { cambiar(A[i],A[j]); i=j; j=2*j+1; } else break; } } void cambiar(int &a, int &b) { int temp=a; a=b; b=temp; } La complejidad de la primera parte del algoritmo es O(n), y la del amontonamiento, que obedece a OT (n) ≤ OT (2n/3) + O(1) = O(log n). Luego, el orden del mont´ ıculo es O(n log n). 9
  • 10. 7. Conclusiones El tema de las ordenaciones es muy interesante desde el punto de vista matem´tico y computacional. Tiene su aplicaci´n en la vida diaria cuando se a o tienen que ordenar cosas como fichas de un directorio personal, publicaciones peri´dicas por fecha, o p´ginas fotocopiadas que est´n en desorden. Sin duda esto o a a adquiere mayor importancia ahora que las personas manejamos vol´menes de u informaci´n cada vez m´s grandes dada la revoluci´n en las telecomunicaciones. o a o Referencias [1] CORMEN, Thomas et al. Introduction to algorithms. MIT Press-McGrawHill, USA, 1996. [2] TENENBAUM, Aaron et al. Estructuras de datos en C. Prentice-Hall Hispanoamericana. M´xico, 1993. e [3] HEUN, Volker. Grundlangen Algorithmen. Vieweg & Sohn. Alemania, 2001. [4] SOLYMOSI, Andreas. Grundkurs Algorithmen und Datenstrukturen. Vieweg & Sohn. Alemania, 2001. 10