Quicksort
-
Upload
jose-pino -
Category
Technology
-
view
10.771 -
download
3
description
Transcript of Quicksort
Introducción al algoritmo de ordenación QuickSort
José Pino
Quicksort
•El mejor algoritmo de ordenación conocido actualmente (el más eficiente).
•Basado en la técnica divide y vencerás.
•O(nlogn)
menores pivot mayores
• Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivot.
• Resituar los demás 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. Los elementos iguales al pivote pueden ser colocados tanto a su derecha
como a su izquierda, dependiendo de la implementación deseada. En este momento, el pivote ocupa exactamente el lugar que le corresponderá en la lista ordenada.
• La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha.
• Repetir este proceso de forma recursiva para cada sublista mientras éstas contengan más de un elemento. Una vez terminado este proceso todos los elementos estarán ordenados.
void quicksort (int[] a, int lo, int hi)
{
int i=lo, j=hi, h;
int x=a[(lo+hi)/2];
do
{
while (a[i]<x) i++;
while (a[j]>x) j--;
if (i<=j)
{
h=a[i]; a[i]=a[j]; a[j]=h;
i++; j--;
}
} while (i<=j);
if (lo<j) quicksort(a, lo, j);
if (i<hi) quicksort(a, i, hi);
}
Ejemplo sencillo de QuickSort
Supongamos tenemos un arreglo con una serie de números desordenados y queremos ordenar por el método de Quicksort:
[7,8,14,12,2,1,3,21]
Seleccionamos un pivot, por ejemplo el 12
[7,8,14,12,2,1,3,21]
•Pivot = 12•Ahora movemos todos los menores al
pivot a la izquierda del pivot y los mayores a la derecha del pivot
[7,8,14,12,2,1,3,21] Original
[7,8,2,1,3,12,14,21]
• Los menores al pivot a la izquierda• Los mayores al pivot a la derecha
[7,8,2,1,3,12,14,21] El 12 ya está
ordenado
[7,8,2,1,3,12,14,21]
•Ahora tenemos dos sub-arreglos de números, por un lado los que están a la izquierda del pivot y por otro los que están a la derecha.
[7,8,2,1,3,12,14,21]
Consideramos el sub-arreglo de la izquierda:
[7,8,2,1,3,12,14,21] Seleccionamos un nuevo pivot para el
nuevo sub-arreglo de la izquierda.
[7,8,2,1,3,12,14,21] Seleccionamos el pivot del sub-arreglo
Pivot = 2
[7,8,2,1,3,12,14,21]
[7,8,2,1,3,12,14,21] •Nuevamente movemos los menores al
pivot a su izquierda y los mayores a su derecha.
[7,8,2,1,3,12,14,21]
[1,2,3,7,8,12,14,21]
[1,3,2,7,8,12,14,21]
El 2 ya está ordenado al igual que el 12
[1,3,2,7,8,12,14,21]
Cuidado: el 1,3,7,8,14,21 aún no están ordenados
Se repite recursivamente hasta tener todos ordenados
[1,2,3,7,8,12,14,21]
• Estructura de Datos en Java, Mark Allen Weiss.
• A practical Introduction to data structures and algorithm analysys. Java
Edition. Clifford A. Shaffer.
• Introduction to Algorithm.2nd edition. Cormen, Leiserson, Rivest & Stein.
• Estructura de datos y algoritmos. Aho, HopCroft & Ullman.
• Algoritmos y estructura de datos. Niklaus Wirth.
• Estructura de datos y algoritmos. Mark Allen Weiss.
• La práctica de la programación. Brian Kernighan & Rob Pike.
• The Algorithm Design Manual by Steve Skiena
• Algorithm Design by Jon Kleinberg and Éva Tardos
• Introduction to the Design and Analysis of Algorithms (2nd Edition)