Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidad3 Ordenamientos
Unidad3 Ordenamientos
Estructura de Datos
Serna
Mtodos de Ordenamiento
3.1
Tipos de Ordenamiento
3.2
Ordenamiento Interno
Los mtodos de ordenamiento interno trabajan en memoria principal y sus implementaciones son
muy variadas, de manera que la eleccin del algoritmo adecuado debe realizarse con criterios de
eficiencia (tiempo y ejecucin) y en funcin de la memoria disponible. Dividiremos los mtodos en
dos grandes grupos:
Estructura de Datos
Serna
2. Se repite el paso anterior, pero ahora con el segundo y tercero, en caso de ser necesario se
intercambian, y as hasta llegar a comparar el segundo con el ultimo.
Consideremos el siguiente ejemplo. Se cuenta con un vector de 6 posiciones donde se inicia una
lista de nmeros { 7, 2, 8, 3, 5, 1 }, la cual ser ordenada en forma ascendente { 1, 2, 3, 5, 7, 8 },
observe como se declara una variable constante entera llamada n la cual tiene un valor de 6,
enseguida se declara un vector de tipo entero que contendr una cantidad n de casillas, en este
caso 6, declaramos tambin las variables i y j que nos ayudaran a desplazarnos entre casilla y
casilla para hacer las comparaciones. Y finalmente la variable tem, almacenara temporalmente el
valor a intercambiar entre las casillas que lo necesiten.
El proceso sera de la siguiente manera:
1ra iteracin, i permanece fijo en la casilla 0 y j se incrementa hasta llegar al ltimo elemento:
{ 7, 2, 8, 3, 5, 1 } j = 1, intercambio generando { 2, 7, 8, 3, 5, 1 }, enseguida
{ 2, 7, 8, 3, 5, 1 } j = 2, no genera intercambio
{ 2, 7, 8, 3, 5, 1 } j = 3, no genera intercambio
{ 2, 7, 8, 3, 5, 1 } j = 4, no genera intercambio
{ 2, 7, 8, 3, 5, 1 } j = 5, intercambio generando { 1, 7, 8, 3, 5, 2 }, termina iteracin
2da iteracin, i permanece fijo en la casilla 1 y j se incrementa hasta llegar al ltimo elemento:
{ 1, 7, 8, 3, 5, 2 } j = 2, no genera intercambio
{ 1, 7, 8, 3, 5, 2 } j = 3, intercambio generando { 1, 3, 8, 7, 5, 2 }, enseguida
{ 1, 3, 8, 7, 5, 2 } j = 4, no genera intercambio
{ 1, 3, 8, 7, 5, 2 } j = 5, intercambio generando { 1, 2, 8, 7, 5, 3 }, termina iteracin
3ra iteracin, i permanece fijo en la casilla 2 y j se incrementa hasta llegar al ltimo elemento:
{ 1, 2, 8, 7, 5, 3 } j = 3, intercambio generando { 1, 2, 7, 8, 5, 3 }
{ 1, 2, 7, 8, 5, 3 } j = 4, intercambio generando { 1, 2, 5, 8, 7, 3 }
{ 1, 2, 5, 8, 7, 3 } j = 5, intercambio generando { 1, 2, 3, 8, 7, 5 }, termina iteracin
4ta iteracin, i permanece fijo en la casilla 3 y j se incrementa hasta llegar al ltimo elemento:
{ 1, 2, 3, 8, 7, 5 } j = 4, intercambio generando { 1, 2, 3, 7, 8, 5 }
{ 1, 2, 3, 7, 8, 5 } j = 5, intercambio generando { 1, 2, 3, 5, 8, 7 }, termina iteracin
5ta iteracin, i permanece fijo en la casilla 4 y j se incrementa hasta llegar al ltimo elemento:
{ 1, 2, 3, 5, 8, 7 } j = 5, intercambio generando { 1, 2, 3, 5, 7, 8 }, termina proceso
void burbuja(int * v, int n) /*** cdigo en C++ ***/
{
/* ordenamiento de burbuja */
for (int i = 0; i < n-1; i++)
for (int j = i + 1; j < n; j++) {
if ( v[i] > v[j] ) { //realiza la comparacin
int tem = v[i]; //si es cierta intercambia los datos
v[i] = v[j];
v[j] = tem;
}
}
}
Algoritmo de Burbuja 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
2
ordenacin cuadrtica O(n ).
Estructura de Datos
Serna
Estructura de Datos
Serna
{ 2, 3, 5, 7, 7, 8 } tem
{ 2, 3, 5, 5, 7, 8 } tem
{ 2, 3, 3, 5, 7, 8 } tem
{ 2, 2, 3, 5, 7, 8 } tem
Estructura de Datos
Serna
3.2.4
Ordenacin Shell
Shell sort lleva este nombre en honor a su inventor, Donald Shell, que lo public en 1959. La idea
bsica de este mtodo es distribuir el arreglo de manera que se genere una matriz de valores
donde cada elemento es comparado de manera adyacente empleando un mecanismo de insercin
directa simple, dicho rango que genera grupos de manera matricial que es reducido gradualmente
hasta estabilizarse en un valor uniforme de 1.
En el mtodo de ordenacin por insercin directa es empleado en cada sub grupo de manera que
cada elemento se compara para su ubicacin correcta en el arreglo con los elementos que se
encuentran en su parte izquierda. Si el elemento a insertar es ms pequeo que el grupo de
elementos que se encuentran a su izquierda, ser necesario efectuar varias comparaciones antes
de su ubicacin. Shell propone que las comparaciones entre elementos se efecten con saltos de
mayor tamao, pero con incrementos decrecientes; as, los elementos quedaran ordenados ms
rpidamente.
El algoritmo para Shell sort seria el siguiente. Algunos autores suponen una secuencia geomtrica
de decremento (2.2) que permite una distribucin presumiblemente ms razonable para el
acomodo de los grupos de elementos a comparar. El algoritmo emplea un arreglo a de 0 a n-1:
inc = round(n/2)
mientras inc > 0 {
para i = inc hasta n 1 {
temp = a[i]
j = i
mientras j = inc && a[j - inc] > temp {
a[j] = a[j - inc]
j = j inc
}
a[j] = temp
}
inc = round(inc / 2.2)
}
Estructura de Datos
Serna
25 59 94 65 23
45 27 73 25 39
10
25 59 94 65 82
45
13 27 94 33 39
25 23 13
27 94 33
39 25 59
94 65 82
45
25 23 33
27 25 59
39 65 73
45 94 82
94
Generando
10 14 13
Y finalmente
10 14 13 25 23 33 27 25 59 39 65 73 45 94 82 94
10 13 14 23 25 25 27 33 39 45 59 65 73 82 94 94
3.2.5
Fue desarrollado en 1945 por John Von Neumann. Conceptualmente, el ordenamiento por mezcla
funciona de la siguiente manera:
1. Si la longitud de la lista es 0 1, entonces ya est ordenada. En otro caso:
2. Dividir la lista desordenada en dos sublistas de aproximadamente la mitad del tamao.
Estructura de Datos
Serna
Una lista pequea necesitar menos pasos para ordenarse que una lista grande.
Se necesitan menos pasos para construir una lista ordenada a partir de dos listas tambin
ordenadas, que a partir de dos listas desordenadas. Por ejemplo, slo ser necesario
entrelazar cada lista una vez que estn ordenadas.
Estructura de Datos
Serna
Figura 1
void intercala(int *a, int na, int *b, int nb, int *v)/* cdigo en C++ */
{
int xa=0, xb=0, xv=0;
while (xa < na && xb < nb) {
if (a[xa] < b[xb])
v[xv] = a[xa++];
else
v[xv] = b[xb++];
xv++;
}
while (xa < na)
v[xv++] = a[xa++];
while (xb < nb)
v[xv++] = b[xb++];
}
void merge(int v[], int n) {
int *a,*b, na,nb, x,y;
if ( n > 1 ) {
if (n%2 == 0)
na = nb = (int) n / 2;
else {
na = (int) n / 2;
nb = na + 1;
}
a = new int [na];
b = new int [nb];
for(x = 0; x < na; x++)
a[x] = v[x];
for(y = 0; y < nb; x++,y++)
b[y] = v[x];
merge(a, na);
Estructura de Datos
Serna
merge(b, nb);
intercala(a, na, b, nb, v);
delete a, b;
}
}
3.2.6
Estructura de Datos
Serna
10
Estructura de Datos
Serna
}
return low;
}
void qsort(int l[],int low,int high)
{
int prvotloc;
if(low<high)
{
prvotloc=partions(l,low,high);
qsort(l,low,prvotloc);
qsort(l,prvotloc+1,high);
}
}
void quicksort(int l[],int n)
{
qsort(l,0,n);
}
3.2.7
Es una variante del algoritmo de seleccin, El ordenamiento por montculos (Heap sort) es un
algoritmo de ordenacin no recursivo, no estable, con complejidad computacional O(n log n).
Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en un montculo
(heap), y luego extraer el nodo que queda como nodo raz del montculo (cima) en sucesivas
iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en una propiedad de los
montculos, por la cual, la cima contiene siempre el menor elemento (o el mayor, segn se haya
definido el montculo) de todos los almacenados en l.
El significado de heap en computacin es el de una cola de prioridades (priority queue). Tiene las
siguientes caractersticas:
Un heap es un arreglo de n posiciones ocupado por los elementos de la cola.
Se mapea un rbol binario de tal manera en el arreglo que el nodo en la posicin i es el
padre de los nodos en las posiciones (2*i) y (2*i+1).
El valor en un nodo es mayor o igual a los valores de sus hijos. Por consiguiente, el nodo
padre tiene el mayor valor de todo su subrbol
heap
arreglo
11
Estructura de Datos
Serna
3.3
Ordenamiento Externo
La ordenacin de archivos se lleva a cabo cuando el volumen de los datos a tratar es demasiado
grande y los mismos no caben en la memoria principal de la computadora.
Al ocurrir esta situacin no pueden aplicarse los mtodos de ordenacin interna, de modo que
debe pensarse en otro tipo de algoritmos para ordenar datos almacenados en archivos.
Por ordenacin de archivos se entiende, entonces, la ordenacin o clasificacin de stos,
ascendente o descendentemente, de acuerdo con un campo determinado al que se denominar
campo clave. La principal desventaja de esta ordenacin es el tiempo de ejecucin, debido a las
sucesivas operaciones de entrada y salida.
Los dos mtodos de ordenacin externa ms importantes son los basados en la mezcla directa y
en la mezcla equilibrada.
3.3.1
12
Estructura de Datos
Serna
F2: 75 68 17 25 05 18 46
Fusin en secuencias de longitud 2.
F1: 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.
F1: 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.
F1: 09 14 75 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.
F1: 04 05 09 13 14 17 18 25 29 31 46 61 68 72 75
3.3.2
El mtodo de ordenacin por mezcla equilibrada, conocido tambin con el nombre de mezcla
natural, es una optimizacin del mtodo de mezcla directa.
La idea central de este mtodo consiste en realizar las particiones tomando secuencias ordenadas
de mxima longitud en lugar de secuencias de tamao fijo previamente determinadas. Luego
realiza la fusin de las secuencias ordenadas, alternativamente sobre dos archivos aplicando estas
acciones en forma repetida se lograra que el archivo original quede ordenado. Para la realizacin
de este proceso de ordenacin se necesitaran cuatro archivos. El archivo original F y tres archivos
auxiliares a los que se denominaran F1, F2 y F3. De estos archivos, dos sern considerados de
entrada y dos de salida; esto, alternativamente, con el objeto de realizar la fusin-particin. El
proceso termina cuando en la realizacin de una fusin-particin el segundo archivo quede vaco.
13
Estructura de Datos
Serna
EJEMPLO :
Suponga que se desean ordenar las claves del archivo F utilizando el mtodo de mezcla
equilibrada.
F: 09 75 14 68 29 17 31 25 04 05 13 18 72 46 61
Los pasos que se realizan son los siguientes:
PARTICIN INICIAL
F2: 09 75 29 25 46 61
F3: 14 68 17 31 04 05 13 18 72
PRIMERA FUSION-PARTICION
F: 09 14 68 75 04 05 13 18 25 46 61 72
F1: 17 29 31
SEGUNDA FUSION-PARTICION
F2: 09 14 17 29 31 68 75
F3: 04 05 13 18 25 46 61 72
TERCERA FUSION-PARTICION
F: 04 05 09 13 14 17 18 25 29 31 46 61 68 72 75
F1:
Obsrvese que al realizar la tercera fusin-particin el segundo archivo queda vaci, por lo que se
puede afirmar que el archivo ya se encuentra ordenado.
14
Estructura de Datos
Serna
Bibliografa
Y. Langsam, M. J. Augenstein, A. Tenenbaum. Data Structures using C and C++. Prentice Hall,
Second edition. ISBN 0-13-036997-7.
http://en.wikipedia.org/wiki/Sorting_algorithm
15