1 - INTRODUCCION
La ordenacin o clasificacin de datos consiste en la disposicin de los mismos de acuerdo
con algn valor o caracterstica. Por ejemplo, cada elemento de una agenda telefnica tiene
un campo nombre, un campo direccin y un campo nmero telefnico. Por lo regular los
datos en la agenda se encuentran organizados en un orden de la A la Z. De la misma forma
un lista vector de datos se dice:
que esta ordenado de manera ascendente, si X [ i ] <= X [ i +1]
y, por otro lado, se dice:
que esta ordenado de manera descendente s X [ i ] >= X [ i +1].
El proceso de ordenacin es uno de los mecanismos ms interesantes cuando llega el
momento de mostrar que existen mltiples soluciones para un mismo problema, y que cada
solucin algortmica tiene sus propias ventajas y desventajas.
Los algoritmos de ordenamiento nos permiten, como su nombre dice, ordenar. En este caso,
nos servirn para ordenar vectores o matrices con valores asignados aleatoriamente. Nos
centraremos en los mtodos ms populares, analizando la cantidad de comparaciones que
suceden, el tiempo que demora y revisando el cdigo, escrito en Java, de cada algoritmo.
En esta unidad vamos a conocer ms a fondo cada mtodo de ordenacin, desde el ms
simple hasta el ms complejo. Se realizaran comparaciones en tiempo de ejecucin, prerequisitos de cada algoritmo, funcionalidad, alcance, etc.
Como por ejemplo los siguientes mtodos:
2 TIPOS DE ALGORITMOS
Una forma de medir la eficiencia de un algoritmo de esta clase, es verificar el nmero de
comparaciones entre valores clave, adems del nmero de movimientos que se tengan que
realizar entre elementos (intercambios) de la lista.
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.
Para poder ordenar una cantidad determinada de nmeros almacenados en un vector o
matriz, existen distintos mtodos (algoritmos) con distintas caractersticas y complejidad.
Existe desde el mtodo ms simple, como el Bubblesort (o Mtodo Burbuja), que son
simples iteraciones, hasta el Quicksort (Mtodo Rpido), que al estar optimizado usando
recursin, su tiempo de ejecucin es menor y es ms efectivo.
2.1 METODOS ITERATIVOS
Estos mtodos son simples de entender y de programar ya que son iterativos, simples ciclos
y sentencias que hacen que el vector pueda ser ordenado.
Dentro de los Algoritmos iterativos encontramos:
Burbuja
Insercin
Seleccin
Shellsort
2.2 - METODOS RECURSIVOS
Estos mtodos son an ms complejos, requieren de mayor atencin y conocimiento para
ser entendidos. Son rpidos y efectivos, utilizan generalmente la tcnica Divide y vencers,
que consiste en dividir un problema grande en varios ms pequeos para que sea ms fcil
resolverlos. Mediante llamadas recursivas a s mismos, es posible que el tiempo de
ejecucin y de ordenacin sea ms ptimo.
Dentro de los algoritmos recursivos encontramos:
Ordenamiento por Mezclas (merge)
Ordenamiento Rpido (quick)
3 METODO DE LA BURBUJA
El algoritmo de la burbuja es uno de los mtodos de ordenacin ms conocidos y uno de los
primeros que aprenden los programadores. El mtodo de la burbuja es uno de los ms
sencillos e intuitivos, es tan fcil como comparar todos los elementos de una lista contra
todos, si se cumple que uno es mayor o menor a otro, entonces los intercambia de posicin.
Se basa en la ordenacin por cambio, y recibe su nombre de la semejanza con las burbujas
de un depsito de agua donde cada burbuja busca su propio nivel.
Los pasos a efectuar en el caso de una ordenacin ascendente (en el caso de la ordenacin
descenderte solo habra que cambiar el signo de comparacin) son:
Ya estn ordenados, pero los dos bucles for seguirn ejecutndose hasta el final. El mtodo
de ordenacin del mtodo burbuja en Java para ordenar un vector o array A es:
public static void Burbuja( int [ ] A ){
int temp;
for(int i=0;i<A.length-1;i++)
for(int j=0;j<A.length-i-1;j++)
if(A[ j ] > A[ j+1 ]){
temp=A[ j ];
A[ j ]=A[ j+1 ];
A[ j+1 ]=temp;
}
}
Observa cmo se declara un vector A de tipo entero que contendr una cantidad n que
ser A.length-1 de casillas, declaramos tambin las variables i y j que nos ayudaran a
desplazarnos entre casilla y casilla para hacer las comparaciones. Y finalmente la variable
temp, almacenara temporalmente el valor a intercambiar entre las casillas que lo necesiten.
El tiempo de ejecucin del algoritmo de la burbuja es del orden O(n2)
3.1 BURBUJA SIMPLE
Como hemos descrito en el apartado anterior, la burbuja ms simple de todas es la que
compara todos con todos, generando comparaciones extras, por ejemplo, no tiene sentido
que se compare con sigo mismo o que se compare con los valores anteriores a l, ya que
supuestamente, ya estn ordenados.
Es uno de los peores algoritmos de ordenacin en cuanto a tiempo de ejecucin, solamente
es recomendable su uso para ordenar listas con un nmero pequeo de elementos.
3.2 - BURBUJA MEJORADA
Una nueva versin del mtodo de la burbuja seria limitando el nmero de comparaciones,
dijimos que era intil que se compare consigo misma. Si tenemos una lista de 10.000
elementos, entonces son 10.000 comparaciones que estn sobrando.
Imaginemos si tenemos 1.000.000 de elementos. El mtodo sera mucho ms ptimo con
n comparaciones menos (n = total de elementos).
Est versin mejorada de dicho algoritmo integra una variable que funge como disparador
(bandera) que permite detectar el momento en que ya no se presenten ms intercambios
aunque su mejora no suele ser tan importante pues el algoritmo sigue comportndose como
una ordenacin cuadrtica O(n2).
Public static void burbuja2(int[ ]v, int n){
bool sw = true;
int temp;
int li = 0;
do {
li++;
sw = true;
for (int i = 0; i < n - li; i++) {
if ( v[i] > v[i+1] ) { // compara los valores
// intercambia los datos
temp = v[i];
v[i] = v[i+1];
v[i+1] = temp;
sw = false;
}
}
} while(!sw);
}
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 }, El
proceso sera de la siguiente manera:
4 INSERCION Y SELECCIN
4.1. - Mtodo de Seleccin
La idea bsica es encontrar el elemento ms pequeo (grande), en orden ascendente de la lista, e
intercambiarlo con el elemento que ocupa la primera posicin en la lista, a continuacin se busca el
siguiente elemento ms pequeo y se transfiere a la segunda posicin. Se repite el proceso hasta que el
ltimo elemento ha sido transferido a su posicin correcta.
El algoritmo de ordenacin depende a su vez del algoritmo necesario para localizar el componente
mayor (menor) de un array o vector. Es un proceso muy similar al mtodo de la burbuja pero haciendo
ms eficiente la bsqueda y evitando intercambios innecesarios.
Consideremos el mismo arreglo del ejemplo anterior { 7, 2, 8, 3, 5, 1 }. El proceso sera de la siguiente
manera:
El mtodo de ordenacin por seleccin en java para ordenar un vector o array de enteros A
es el siguiente:
Sea una lista A[1], A[2], ... A[n]. Los pasos a dar para una ordenacin ascendente son:
1. Ordenar A[1] y A[2].
2. Comparar A[3] con A[2], si A[3] es mayor o igual a que A[2], sigue con el siguiente
elemento si no se compara A[3] con A[1]; si A[3] es mayor o igual que A[1], insertar
A[3] entre A[1] yA[2]. Si A[3] es menor que A[1], entonces transferir A[3] a A[1],
A[1] a A[2] y A[2] a A[3].
3. Se suponen ordenados los n-1 primeros elementos y corresponde insertar el n-simo
elemento. Si A[m] es mayor que A[k] (con K = 1, 2, ..., m-1), se debe correr una
posicin A[k+1], ... A[m-1] y almacenar A[m] en la posicin k+1.
Consideremos el mismo arreglo del ejemplo anterior { 7, 2, 8, 3, 5, 1 }. El proceso sera de
la siguiente manera:
El ordenamiento por mezcla incorpora dos ideas principales para mejorar su tiempo de
ejecucin:
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.
A continuacin se describe el algoritmo en pseudocdigo (se advierte de que no se incluyen
casos especiales para vectores vacos, una implementacin en un lenguaje de programacin
real debera tener en cuenta estos detalles):
funcion merge_sort( list m )
if length(m) 1
return m
var list left, right, result
var integer middle = length(m) / 2
for each x in m up to middle
add x to left
for each x in m after middle
add x to right
left = merge_sort(left)
right = merge_sort(right)
result = merge(left, right)
return result
funcion merge( list left, right)
var list result
while length(left) > 0 or length(right) > 0
if length(left) > 0 and length(right) > 0
if first(left) first(right)
append first(left) to result
left = rest(left)
else
append first(right) to result
right = rest(right)
else if length(left) > 0
append first(left) to result
left = rest(left)
else if length(right) > 0
append first(right) to result
right = rest(right)
end while
return result
Este algoritmo consiste bsicamente en dividir en partes iguales la lista de nmeros y luego
mezclarlos comparando y dejandolos ordenados.
Si se piensa en este algoritmo recursivamente, podemos imaginar que dividir la lista hasta
tener un elemento en cada lista, luego lo compara con el que est a su lado y segn
corresponda, lo sita donde corresponde.
En la siguiente figura podemos ver cmo funciona:
6 METODO SHELLSORT
Shellsort 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 subgrupo 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 Shellsort sera 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.
Este mtodo es una mejora del algoritmo de ordenamiento por Insercin (Insertsort).Si
tenemos en cuenta que el ordenamiento por insercin es mucho ms eficiente si nuestra
lista de nmeros esta semi-ordenada y que desplaza un valor una nica posicin a la vez.
Durante la ejecucin de este algoritmo, los nmeros de la lista se van casi-ordenando y
finalmente, el ltimo paso o funcin de este algoritmo es un simple mtodo por insercin
que, al estar casi-ordenados los nmeros, es ms eficiente.
Ejemplo3: Se marcan el pivote y los ndices i y j con las letras p,i y j respectivamente:
El algoritmo es el siguiente:
public void Quicksort(int matrix[], int a, int b){
this.matrix = new int[matrix.length];
int buf;
int from = a;
int to = b;
int pivot = matrix[(from+to)/2];
do{
while(matrix[from] < pivot){
from++;
}
while(matrix[to] > pivot){
to--;
}
if(from <= to){
buf = matrix[from];
matrix[from] = matrix[to];
matrix[to] = buf;
from++;
to--;
}
}while(from <= to);
if(a < to){
Quicksort(matrix, a, to);
}
if(from < b){
Quicksort(matrix, from, b);
}
this.matrix = matrix;
}
El mtodo ordena un array A d eenteros desde la posicin izq hasta la posicin der. En la
primera llamada recibir los valores izq = 0, der = ELEMENTOS-1.
Otro mtodo:
public static void quicksort(int A[], int izq, int der) {
int
int
int
int
while(i<j){
// mientras no se crucen las bsquedas
while(A[i]<=pivote && i<j) i++; // busca elemento mayor que pivote
while(A[j]>pivote) j--;
// busca elemento menor que pivote
if (i<j) {
// si no se han cruzado
aux= A[i];
// los intercambia
A[i]=A[j];
A[j]=aux;
}
}
A[izq]=A[j]; // se coloca el pivote en su lugar de forma que tendremos
A[j]=pivote; // los menores a su izquierda y los mayores a su derecha
if(izq<j-1)
quicksort(A,izq,j-1); // ordenamos subarray izquierdo
if(j+1 <der)
quicksort(A,j+1,der); // ordenamos subarray derecho
}
8 COMPLEJIDAD
Cada algoritmo de ordenamiento por definicin tiene operaciones y clculos mnimos y
mximos que realiza (complejidad), a continuacin una tabla que indica la cantidad de
clculos que corresponden a cada mtodo de ordenamiento:
9 COMPARACION DE TIEMPOS
Se han ordenado una cantidad determinada de elementos aleatorios en una lista mediante
distintos mtodos de ordenamiento. (en segundos)
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.
11 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.
12 EJEMPLOS EN FLASH
Aplicaciones Flash de ejemplo para estos mtodos de ordenacin:
http://aniei.org.mx/paginas/uam/CursoPoo/Recursos/SelectionSort.swf
http://aniei.org.mx/paginas/uam/CursoPoo/curso_poo_SelectionSort.html
http://aniei.org.mx/paginas/uam/CursoPoo/Recursos/InsertionSort.swf
http://aniei.org.mx/paginas/uam/CursoPoo/curso_poo_InsertionSort.html
QUICK SORT
http://aniei.org.mx/paginas/uam/CursoPoo/curso_poo_QuickSort.html
SHELL SORT
http://aniei.org.mx/paginas/uam/CursoPoo/curso_poo_ShellSort.html
http://aniei.org.mx/paginas/uam/CursoPoo/curso_poo_BubbleSort.html