Está en la página 1de 6

Generalidades

Tipos de Algoritmos
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 Burbja),
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.
Algoritmos basados en mtodos 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
Algoritmos basados en mtodos 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 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)

Mtodo Quicksort
El mtodo Quicksort basa su estrategia en la idea intuitiva de que es ms fcil
ordenar una gran estructura de datos subdividindolas en otras ms pequeas
introduciendo un orden relativo entre ellas. En otras palabras, si dividimos el
arreglo a ordenar en dos subarreglos de forma que los elementos del
subarreglo inferior sean ms pequeos que los del subarreglo superior, y
aplicamos el mtodo reiteradamente, al final tendremos el arreglo inicial
totalmente ordenado. Existen adems otros mtodos conocidos, el de
ordenacin por montculo y el de shell.
El algoritmo Quicksort fue desarrollado en 1962 por C.A.R. Hoare, antes de que
se implementaran los primeros lenguajes con capacidad para ejecutar
funciones recursivas.

El ordenamiento por particin (Quick Sort) se puede definir en una forma


ms conveniente como un procedimiento recursivo.
Tiene aparentemente la propiedad de trabajar mejor para elementos de
entrada desordenados completamente, que para elementos semiordenados.
Esta situacin es precisamente la opuesta al ordenamiento de burbuja.
Este tipo de algoritmos se basa en la tcnica "divide y vencers", o sea
es ms rpido y fcil ordenar dos arreglos o listas de datos pequeos, que un
arreglo o lista grande.
Normalmente al inicio de la ordenacin se escoge un elemento
aproximadamente en la mitad del arreglo, as al empezar a ordenar, se debe
llegar a que el arreglo este ordenado respecto al punto de divisin o la mitad
del arreglo.
Se podr garantizar que los elementos a la izquierda de la mitad son los
menores y los elementos a la derecha son los mayores.
Los siguientes pasos son llamados recursivos con el propsito de
efectuar la ordenacin por particin al arreglo izquierdo y al arreglo derecho,
que se obtienen de la primera fase. El tamao de esos arreglos en promedio se
reduce a la mitad.
As se contina hasta que el tamao de los arreglos a ordenar es 1, es
decir, todos los elementos ya estn ordenados.
En promedio para todos los elementos de entrada de tamao n, el
mtodo hace O(n log n) comparaciones, el cual es relativamente eficiente.
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;
}
Descripcin del Algoritmo:
Elegir un elemento de la lista de elementos a ordenar, al que llamaremos
pivote.
La idea central de este algoritmo consiste en lo siguiente:
Se toma un elemento x de una posicin cualquiera del arreglo.
Se trata de ubicar a x en la posicin correcta del arreglo, de tal forma
que todos los elementos que se encuentran a su izquierda sean
menores o iguales a x y todos los elementos que se encuentren a su
derecha sean mayores o iguales a x.
Se repiten los pasos anteriores pero ahora para los conjuntos de datos
que se encuentran a la izquierda y a la derecha de la posicin correcta
de x en el arreglo.
Resituar los dems elementos de la lista a cada lado del pivote, de
manera que a un lado queden todos los menores que l, y al otro los
mayores. En este momento, el pivote ocupa exactamente el lugar que le
corresponder en la lista ordenada.
Repetir este proceso de forma recursiva para cada sublista mientras
stas contengan ms de un elemento. Una vez terminado este proceso
todos los elementos estarn ordenados.
Como se puede suponer, la eficiencia del algoritmo depende de la
posicin en la que termine el pivote elegido.
Anlisis del algoritmo:
Estabilidad: No es estable.
Requerimientos de Memoria: No requiere memoria adicional en su forma
recursiva. En su forma iterativa la necesita para la pila.
Ventajas:
Muy rpido.
No requiere memoria adicional.
Desventajas:
Implementacin un poco ms complicada.
Recursividad (utiliza muchos recursos).

Mucha diferencia entre el peor y el mejor caso.


Complejidad computacional del Quicksort:
En el mejor de los casos tiene un costo de O(n*log (n)). Que es cuando el
pibote siempre queda al medio del arreglo.

En el peor de los casos tiene un costo de O(n^2). Cuando el pibote siempre se


inclina hacia a un lado, es decir, genera un arreglo de slo 1 elemento y una
segunda con el resto de elementos.

En el caso promedio tambin tiene un costo de O(n*log (n)). Se produce


cuando el pibote se inclina ms hacia un lado y los 2 subarreglos tienen distinto
tamao de elementos.

Para calcular el tiempo de ejecucin se us la funcin clock() que determina el


tiempo usado por el procesador. En este caso defino 3 variables ini, final y total.
1ini=clock(); // Antes del quicksort:
2final = clock(); //Despus que se ejecuta el quicksort

3total =((double)(final ini)) /


4CLOCKS_PER_SEC; // El valor retornado por clock()
5debe ser dividido por el valor de la macro CLOCKS_PER_SEC
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:

Algoritmo
Burbuja
Insercin
Seleccin
Shell
Merge
Quick (Rpido)

Operaciones mximas
(n)
(n/4)
(n)
(n logn)
(n logn)
(n) en peor de los casos y (n logn) en
el
promedio de los casos.

COMPARACION DE TIEMPOS
Se han ordenado una cantidad determinada de elementos aleatorios en una
lista mediante distintos mtodos de ordenamiento (en segundos).

256 elementos
Burbuja: 0.0040
Seleccin: 0.0030
Insercin: 0.0040
Rpido: 0.0010
Shell: 0.0010
Merge: 0.0040

512 elementos
Burbuja: 0.0050
Seleccin: 0.0040
Insercin: 0.0050
Rpido: 0.0010
Shell: 0.0020
Merge: 0.003

2048 elementos

16384 elementos

Burbuja: 0.022
Seleccin: 0.015
Insercin: 0.013
Rpido: 0.0010
Shell: 0.0060
Merge: 0.0050

Burbuja: 1.055
Seleccin: 0.9
Insercin: 0.577
Rpido: 0.0080
Shell: 0.0090
Merge: 0.014

Como podemos analizar, el algoritmo que se va demorando cada vez ms


tiempo es el de la burbuja, luego de seleccin y tercero el insercin. Los
algoritmos que los siguen son el Shell y el de ordenacin por mezcla, pero el
ms ptimo es el Rpido.

Eligiendo el Pivote
La velocidad de ejecucin del algoritmo depende en gran medida de cmo se
implementa este mecanismo, una mala implementacin puede suponer que el
algoritmo se ejecute a una velocidad mediocre o incluso psima. La eleccin
del pivote determina las particiones de la lista de datos, por lo tanto, huelga
decir que esta es la parte ms crtica de la implementacin del algoritmo
QuickSort. Es importante intentar que al seleccionar el pivote v las particiones
L1 y L3 tengan un tamao idntico dentro de lo posible.
Elegir el primero o el ltimo de la lista nunca es una buena idea ya que los
elementos de la lista no estn uniformemente distribuidos. Por otro lado, si
contamos con un buen generador de nmeros aleatorios, podemos elegir un
pivote al azar de entre todos los elementos de la lista. Esta estrategia es
segura puesto que es improbable que un pivote al azar d como resultado una
particin mala, pero tiene como contrapartida que en algunas ocasiones si
puede arrojar un resultado de O(n2), adems, la eleccin de nmeros
aleatorios puede incrementar el tiempo de ejecucin del algoritmo.
Una buena estrategia para solucionar la seleccin del pivote ampliamente
extendida es la conocida como a tres bandas. En esta estrategia lo que se
persigue es hacer una media con los valores de tres de los elementos de la
lista. Por ejemplo si nuestra lista es [ 8, 4, 9, 3, 5, 7, 1, 6, 2 ] la media sera ( 8 +
2 + 5 ) / 3 = 5 lo que dara lugar a las siguientes particiones:
L1 = [ 8, 9, 7, 6 ]
L2 = [ 5 ]
L3 = [ 1, 2, 4, 3 ]
Esta estrategia no nos asegura que siempre nos dar la mejor seleccin del
pivote, sino que estadsticamente, la eleccin del pivote sea buena.

También podría gustarte