Quicksort

15
Introducción al algoritmo de ordenación QuickSort José Pino

description

Breve introducción al algoritmo de ordenación QuickSort.

Transcript of Quicksort

Page 1: Quicksort

Introducción al algoritmo de ordenación QuickSort

José Pino

Page 2: Quicksort

Quicksort

•El mejor algoritmo de ordenación conocido actualmente (el más eficiente).

•Basado en la técnica divide y vencerás.

•O(nlogn)

Page 3: Quicksort

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.

Page 4: Quicksort

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);

}

Page 5: Quicksort

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]

Page 6: Quicksort

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

Page 7: Quicksort

[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

Page 8: Quicksort

[7,8,2,1,3,12,14,21] El 12 ya está

ordenado

Page 9: Quicksort

[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.

Page 10: Quicksort

[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.

Page 11: Quicksort

[7,8,2,1,3,12,14,21] Seleccionamos el pivot del sub-arreglo

Pivot = 2

[7,8,2,1,3,12,14,21]

Page 12: Quicksort

[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]

Page 13: Quicksort

[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

Page 14: Quicksort

Se repite recursivamente hasta tener todos ordenados

[1,2,3,7,8,12,14,21]

Page 15: Quicksort

• 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)