Introducción al algoritmo de ordenación QuickSortJosé Pino
QuicksortEl mejor algoritmo de ordenación conocido actualmente (el más eficiente).Basado en la técnica divide y vencerás.O(nlogn)
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.menorespivotmayores
voidquicksort (int[] a, int lo, inthi){inti=lo, j=hi, h;intx=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 QuickSortSupongamos 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 = 12Ahora 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 izquierdaLos 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-arregloPivot= 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 practicalIntroductionto data structures and algorithmanalysys. Java Edition. Clifford A. Shaffer.Introductionto Algorithm.2nd edition. Cormen, Leiserson, Rivest & Stein.Estructura de datos y algoritmos. Aho, HopCroft & Ullman.Algoritmos y estructura de datos. NiklausWirth.Estructura de datos y algoritmos. Mark Allen Weiss.La práctica de la programación. Brian Kernighan & Rob Pike.TheAlgorithmDesign Manual by Steve SkienaAlgorithmDesignby Jon Kleinberg and Éva TardosIntroductiontotheDesign and Analysis of Algorithms (2nd Edition)

Quicksort

  • 1.
    Introducción al algoritmode ordenación QuickSortJosé Pino
  • 2.
    QuicksortEl mejor algoritmode ordenación conocido actualmente (el más eficiente).Basado en la técnica divide y vencerás.O(nlogn)
  • 3.
    Elegir un elementode 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.menorespivotmayores
  • 4.
    voidquicksort (int[] a,int lo, inthi){inti=lo, j=hi, h;intx=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);}
  • 5.
    Ejemplo sencillo deQuickSortSupongamos 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]
  • 6.
    Seleccionamos un pivot,por ejemplo el 12[7,8,14,12,2,1,3,21]Pivot = 12Ahora movemos todos los menores al pivot a la izquierda del pivot y los mayores a la derecha del pivot
  • 7.
    [7,8,14,12,2,1,3,21] Original[7,8,2,1,3,12,14,21]Los menores al pivot a la izquierdaLos mayores al pivot a la derecha
  • 8.
  • 9.
    [7,8,2,1,3,12,14,21] Ahora tenemosdos 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.
  • 10.
    [7,8,2,1,3,12,14,21] Consideramos elsub-arreglo de la izquierda:[7,8,2,1,3,12,14,21] Seleccionamos un nuevo pivot para el nuevo sub-arreglo de la izquierda.
  • 11.
    [7,8,2,1,3,12,14,21] Seleccionamos elpivot del sub-arregloPivot= 2[7,8,2,1,3,12,14,21]
  • 12.
    [7,8,2,1,3,12,14,21] Nuevamente movemoslos 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]
  • 13.
    [1,3,2,7,8,12,14,21] El 2ya 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
  • 14.
    Se repite recursivamentehasta tener todos ordenados [1,2,3,7,8,12,14,21]
  • 15.
    Estructura de Datosen Java, Mark Allen Weiss.A practicalIntroductionto data structures and algorithmanalysys. Java Edition. Clifford A. Shaffer.Introductionto Algorithm.2nd edition. Cormen, Leiserson, Rivest & Stein.Estructura de datos y algoritmos. Aho, HopCroft & Ullman.Algoritmos y estructura de datos. NiklausWirth.Estructura de datos y algoritmos. Mark Allen Weiss.La práctica de la programación. Brian Kernighan & Rob Pike.TheAlgorithmDesign Manual by Steve SkienaAlgorithmDesignby Jon Kleinberg and Éva TardosIntroductiontotheDesign and Analysis of Algorithms (2nd Edition)