Como usar o método de partição para Quicksort em Java

A parte mais difícil da técnica Java Quicksort é o divisória método. Este método aceita dois parâmetros: os índices elevados e baixos que marcam a parte da matriz que devem ser classificados. O esquema básico da divisória método é algo como isto:

  1. Escolha um ponto de pivô.

  2. Mover todos os elementos que são menos do que o ponto de articulação para o lado esquerdo da partição.

  3. Mover todos os elementos que são maiores do que o ponto de articulação para o lado direito da partição.

  4. Retornar o índice do ponto de pivô.

A técnica mais comum para dividir a matriz é para manter duas variáveis ​​de índice, com o nome Eu e j, que o trabalho a partir de ambas as extremidades da matriz na direcção do centro.

Primeiro, Eu começa no início da matriz e move-se para a frente até encontrar um valor que é maior que o valor de articulação. Então j começa na extremidade oposta da matriz e move-se para trás até que encontra um valor que é menor que o ponto de articulação.

Nesse ponto, o divisória método tem um valor que é maior do que o ponto de articulação no lado esquerdo da matriz e um valor que é menor que o ponto de articulação no lado direito da matriz. Por isso, troca-los.

Em seguida, o ciclo repete-se: Eu é incrementado até que encontre um outro valor que é maior que o valor do pivô, j é diminuída até que encontre um outro valor que é menos do que o valor de pivô, e os elementos são trocados. Este processo se repete até que j é menos do que Eu, o que significa que os índices de ter atravessado o particionamento e é feito.

Aqui está algum código que coloca tudo junto:

partição int public static (int baixa, int alto) {int pivot = a [baixo] -int i = baixa - 1-int j = Alto + 1-while (i lt; j) {for (i ++ - a [i] lt; pivot- i ++) - para (j --- uma [j]> pivot- j -) - se (i lt; j) swap (i, j) -} retornar j-}

Repare que neste código, a matriz que está sendo classificada é uma estática int matriz chamada uma. As extremidades baixas e altas de partição para ser repartido são passados ​​como parâmetros, e o método começa por escolher o primeiro elemento na partição como o valor para o ponto de articulação. Em seguida, ele inicializa as variáveis ​​de índice Eu e j a partir dos parâmetros.

Note-se que 1 é subtraído do valor baixo e que é adicionado um ao alto valor. As variáveis ​​índice dar um passo para trás da matriz antes de o loop começa para que eles possam obter um bom começo.

o enquanto laço é utilizado para indicar quando o particionamento é terminado. Ele repete enquanto Eu é menos do que j. Após estas variáveis ​​índice de parar, o particionamento é feito, e o valor de j é retornado para indicar o ponto de índice que divide a partição esquerda a partir da partição direita.

No corpo do enquanto circuito são dois sem corpo estranho para laços. Estes para laços não têm corpos, porque o seu único propósito é mover seus valores de índice até encontrar um valor que é menor ou maior que o valor de pivô.

O primeiro para incrementa o circuito Eu índice variável até encontrar um valor que é maior do que o ponto de pivô. este para laço encontra o primeiro valor que pode precisar de ser movido para o outro lado da matriz.

Em seguida, o segundo para circuito diminui o j índice variável até encontrar um valor que é menos do que o ponto pivot. Portanto, este circuito de encontrar um valor que pode ter de ser trocado com o valor encontrado pelo primeiro para loop.

Finalmente, o E se instrução verifica se os índices de ter atravessado. Partindo do princípio de que eles não têm, uma troca método é chamado para trocar os elementos. o troca método é misericordiosamente simples:

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

Este método move o Eu elemento a uma variável temporária, move o j o elemento de Eu elemento, e, em seguida, move-se a variável temporária para o j elemento.

menu