Cómo utilizar el método de partición para quicksort en java

La parte más difícil de la técnica de Java Quicksort es la tabique método. Este método acepta dos parámetros: los índices de bajas y altas que marcan la parte de la matriz que debe ser solucionado. El esquema básico de la tabique método es algo como esto:

  1. Elija un punto de pivote.

  2. Mueva todos los elementos que son menos que el punto de giro hacia el lado izquierdo de la partición.

  3. Mueva todos los elementos que son mayores que el punto de pivote en el lado derecho de la partición.

  4. Devuelve el índice del punto de pivote.

La técnica más común para dividir la matriz es mantener dos variables de índice, llamado yo y j, que el trabajo de ambos extremos de la matriz hacia el centro.

En primer lugar, yo comienza al principio de la matriz y se mueve hacia adelante hasta que encuentra un valor que es mayor que el valor de pivote. entonces j comienza en el extremo opuesto de la matriz y se mueve hacia atrás hasta que encuentra un valor que es menor que el punto de pivote.

En ese punto, la tabique método tiene un valor que es mayor que el punto de pivote en el lado izquierdo de la matriz y un valor que es menor que el punto de pivote en el lado derecho de la matriz. Por lo tanto, los permuta.

A continuación, el ciclo se repite: yo se incrementa hasta que encuentra otro valor que es mayor que el valor de pivote, j se disminuye hasta que encuentra otro valor que es menor que el valor de pivote, y los elementos se intercambian. Este proceso se repite hasta j es menos que yo, lo que significa que los índices han cruzado y el reparto se hace.

Aquí hay un código que pone todo junto:

int partición pública estática (int baja, int altura) {int pivote = a [bajo] -INT i = Baja - 1-int j = Alta + 1-while (i lt; j) {for (i ++ - a [i] lt; pivotante i ++) - para (j --- una [j]> pivotante j -) - si (i lt; j) swap (i, j) -} volver j-}

Observe que en este código, la matriz está ordenada es una estática int matriz denominada la. Los extremos inferior y superior de la partición a dividirse se pasan como parámetros, y el método comienza eligiendo el primer elemento de la partición como el valor para el punto de pivote. A continuación, se inicializa las variables de índice yo y j a partir de los parámetros.

Observe que 1 se resta del valor bajo y que se suma 1 al alto valor. Las variables de índice toma un paso atrás de la matriz antes de que el bucle se inicia para que puedan obtener un buen comienzo.

los mientras bucle se utiliza para indicar cuando se termina la partición. Se repite, siempre y cuando yo es menos que j. Después de detener estas variables de índice, la partición se hace, y el valor de j se devuelve para indicar el punto índice que divide la partición izquierda desde la partición correcta.

En el cuerpo de la mientras bucle son dos extraños sin cuerpo para bucles. Estas para bucles no tienen cuerpos, ya que su único propósito es mover sus valores de índice hasta que encuentran un valor que es ya sea menor o mayor que el valor de pivote.

El primero para incrementa el bucle yo variable de índice hasta que encuentra un valor que es mayor que el punto de pivote. Esta para bucle encuentra el primer valor que podrían necesitar ser trasladado al otro lado de la matriz.

A continuación, el segundo para decrementa el bucle j variable de índice hasta que encuentra un valor que es menor que el punto de pivote. Así que este bucle se encuentra un valor que puede ser necesario intercambiar con el valor encontrado por la primera para lazo.

Por último, la si cheques declaración de si los índices se han cruzado. Suponiendo que no lo han hecho, una intercambio método se llama para cambiar los elementos. los intercambio método es misericordiosamente simple:

public static void swap (int i, int j) {int temp = a [i] -a [i] = a [j] -a [j] = TEMP-}

Este método mueve el yo elemento a una variable temporal, mueve el j elemento a la yo elemento y, a continuación, mueve la variable temporal a la j elemento.




» » » » Cómo utilizar el método de partición para quicksort en java