Convenção pela metade
Quando o número de elementos em uma lista é uniforme, a metade da lista significa que a primeira metade literal da lista é a primeira metade, e a segunda metade literal da lista é a segunda metade. O elemento médio (médio) de toda a lista é o último elemento da primeira lista. Isso significa que o índice do meio é de comprimento / 2 - 1, pois a contagem de índice começa de zero. Comprimento é o número de elementos na lista. Por exemplo, se o número de elementos for 8, a primeira metade da lista tem 4 elementos e a segunda metade da lista também possui 4 elementos. Está bem. Desde que a contagem de índice começa a partir de 0, o índice do meio é 3 = 8 /2 - 1.
E o caso, quando o número de elementos na lista ou sub-lista é estranho? No início, o comprimento ainda está dividido por 2. Por convenção, o número de elementos na primeira metade desta divisão é o comprimento / 2 + 1/2. A contagem de índice começa de zero. O índice do meio é dado por comprimento / 2 - 1/2. Isso é considerado o termo intermediário, por convenção. Por exemplo, se o número de elementos em uma lista for 5, o índice do meio será 2 = 5/2 - 1/2. E há três elementos na primeira metade da lista e dois elementos no segundo tempo. O elemento intermediário de toda a lista é o terceiro elemento no índice, 2, que é o índice do meio porque a contagem do índice começa de 0.
Divisão dessa maneira é um exemplo de aritmética inteira.
Mediana de três valores
Pergunta: Qual é a mediana da sequência:
C b a
Solução:
Organize a lista em ordem crescente:
A b c
O termo intermediário, B, é a mediana. É a magnitude que fica entre as outras duas magnitudes.
Procurar a mediana em uma lista não é esse tipo. Por exemplo, em uma lista de 19 elementos não classificados, a mediana para o primeiro elemento, elemento médio e o último elemento pode ser necessário. Esses três valores podem não estar em ordem crescente; E assim, seus índices devem ser levados em consideração.
Com classificação rápida, a mediana para toda a lista e sub-listas são necessárias. O pseudocódigo para procurar a mediana de três valores espaçados em uma lista (matriz) é:
MID: = ⌊ (baixo + alto) / 2⌋O termo "arr" significa matriz. Este segmento de código procura a mediana e também faz alguma classificação. Este segmento de código parece simples, mas pode ser bastante confuso. Então, preste atenção à seguinte explicação:
A classificação neste tutorial produzirá uma lista em que o primeiro valor é o menor valor, e o último valor é o maior valor. Com o alfabeto, A é menor que Z.
Aqui, o pivô é a mediana resultante. O baixo é o menor índice da lista ou sub-lista (não necessariamente para o menor valor); High é o índice mais alto da lista ou sub-lista (não necessariamente para o valor mais alto), e o meio é o índice do meio convencional (não necessariamente para o valor médio de toda a lista).
Portanto, a mediana a ser obtida está entre o valor do menor índice, o valor do índice do meio e o valor do índice mais alto.
No código, o índice do meio convencional é obtido primeiro. Neste começo, a lista é não classificada. A comparação e algum rearranjo em ordem crescente dos três valores devem ocorrer ao mesmo tempo. A primeira estatura IF compara o valor para o menor índice e o do índice do meio. Se o do índice do meio for menor que o do índice mais baixo, os dois valores trocam posições. Isso começa a classificar e altera o arranjo de valores na lista ou sub-lista. A segunda estatização IF compara o valor para o índice mais alto e o do menor índice. Se o do índice mais alto for menor que o do índice mais baixo, os dois valores trocam posições. Isso continua com alguma classificação e mudança do arranjo de valores na lista ou sub-lista. A terceira estatura IF compara o valor para o índice do meio e o do mais alto índice. Se o do índice mais alto for menor que o índice do meio, os dois valores trocam posições. Alguma classificação ou rearranjo também pode ocorrer aqui. Esta terceira condição se não é como os dois anteriores.
No final desses três swaps, o valor médio dos três valores em questão seria um [alto], cujo conteúdo original poderia ter sido alterado no segmento de código. Por exemplo, considere a sequência não classificada:
C b a
Já sabemos que a mediana é B. No entanto, isso deve ser comprovado. O objetivo aqui é obter a mediana desses três valores usando o segmento de código acima. A primeira estatura se compara B e C. Se B for menor que C, as posições de B e C devem ser trocadas. B é menor que C, então o novo arranjo se torna:
B c a
Observe que os valores para o menor índice e o índice do meio mudaram. A segunda estatura se compara A e B. Se A for menor que B, as posições de A e B precisam ser trocadas. A é menor que B, então o novo arranjo se torna:
A c b
Observe que os valores para o índice mais alto e o menor índice mudaram. A terceira estatura se compara C e B. Se C for menor que B, as posições de C e B precisam ser trocadas. C não é menor que B, então nenhuma troca ocorre. O novo arranjo permanece como o anterior, ou seja:
A c b
B é a mediana, que é, um [alto], e é o pivô. Então, o pivô nasce no extremo extremo da lista ou sub-lista.
A função de troca
Outro recurso necessário para a classificação rápida é a função de troca. A função de troca, troca os valores de duas variáveis. O pseudocódigo para a função de troca é:
Definir troca (x, y)Aqui, x e y se referem aos valores reais e não às cópias.
A classificação neste artigo produzirá uma lista em que o primeiro valor é o menor valor, e o último valor é o maior valor.
Conteúdo do artigo
Algoritmo de classificação rápida
A maneira normal de classificar uma lista não classificada é considerar os dois primeiros valores. Se não estiverem em ordem, coloque -os em ordem. Em seguida, considere os três primeiros valores. Digitalize os dois primeiros a ver onde o terceiro valor se encaixa e encaixe -o adequadamente. Então, considere os quatro primeiros valores. Digitalize os três primeiros valores para ver onde o quarto valor se encaixa e encaixe -o adequadamente. Continue com este procedimento até que toda a lista seja classificada.
Este procedimento, também conhecido como o tipo de força bruta, na linguagem de programação de computadores, é muito lenta. O algoritmo de classificação rápido vem com um procedimento muito mais rápido.
As etapas para o algoritmo do Quicksort são as seguintes:
O pseudocode rápido é:
Algoritmo Quicksort (arr, baixo, alto) éUm pseudocódigo de partição
O pseudocódigo de partição usado neste tutorial é:
Partição de algoritmo (ARR, baixa, alta) éNa ilustração da classificação rápida abaixo, este código é usado:
Ilustração de classificação rápida
Considere a seguinte lista não classificada (matriz) de cartas alfabéticas:
Q W E R T Y U I O P
Por inspeção, a lista classificada é:
E i o p q r t u w y
A lista classificada agora será comprovada, usando os segmentos de algoritmo e pseudocódigo acima, da lista não classificada:
Q W E R T Y U I O P
O primeiro pivô é determinado a partir de arr [0] = q, arr [4] = t e arr [9] = p, e é identificado como q e colocado no extremo direito da lista. Então, a lista com qualquer função pivô se torna:
P w e r t y u i o q
O pivô atual é q. O procedimento pivô fez uma pequena classificação e colocou P na primeira posição. A lista resultante deve ser reorganizada (particionada), de modo que todos os elementos à esquerda são menores em valor, depois o pivô e todos os elementos à direita do pivô, são iguais ou maiores que o pivô. O computador não pode fazer partição por inspeção. Então, isso faz usando os índices e o algoritmo de partição acima.
Os índices baixos e altos agora são 0 e 9. Portanto, o computador começará a digitalizar o índice 0 até atingir um índice, cujo valor é igual ou maior que o pivô e para lá temporariamente. Ele também escaneará a partir da extremidade alta (à direita), o índice 9, descendo, até atingir um índice cujo valor é menor ou igual ao pivô e para lá temporariamente. Isso significa duas posições de parada. Se eu, a variável de índice incremental, de baixa ainda não for igual ou maior que a variável de índice decrescente, J de alta, esses dois valores serão trocados. Na situação atual, a digitalização de ambas as extremidades parou em W e O. Então a lista se torna:
P e r t y u i w q
O pivô ainda é q. A digitalização em direções opostas continua e para de acordo. Se eu ainda não for igual ou maior que J, os dois valores nos quais a digitalização de ambas as extremidades paradas são trocadas. Desta vez, a digitalização de ambas as extremidades parou em r e eu. Então, o arranjo da lista se torna:
P e i t y u r w q
O pivô ainda é q. A digitalização em direções opostas continua e para de acordo. Se eu ainda não for igual ou maior que J, os dois valores nos quais a digitalização foram interrompidos, são trocados. Desta vez, a digitalização de ambas as extremidades parou em t para i e eu para j. Eu e J nos conhecemos ou cruzamos. Então, não pode haver troca. A lista permanece a mesma que:
P e i t y u r w q
Neste ponto, o pivô, Q, deve ser colocado em sua posição final na classificação. Isso é feito trocando arr [i] com arr [alta], trocando t e q. A lista se torna:
P e i q y u r w t
Neste ponto, a partição para toda a lista terminou. O pivô = Q desempenhou seu papel. Agora existem três sub-listas, que são:
P e i q y u r w t
A partição é divisão e conquista (classificação) no paradigma. Q está em sua posição de classificação correta. Cada elemento à esquerda de Q é menor que o Q, e todo elemento à direita de Q é maior que q. No entanto, a lista de esquerda ainda não é classificada; e a lista certa ainda não está classificada. Toda a função de classificação rápida deve ser chamada recursivamente para classificar a sub-lista esquerda e a sub-lista direita. Essa lembrança de classificação rápida tem que continuar; Novas sub-listas se desenvolverão até que toda a lista original seja completamente classificada. Para cada lembrança da função de classificação rápida, a sub-lista esquerda é atendida primeiro antes que a sub-lista direita correspondente seja atendida. Um novo pivô deve ser obtido para cada sub-lista.
Para a sub-lista:
P O E I
O pivô (mediano) para p, o e eu é determinado. O pivô seria o. Para esta sub-lista, e relacionado à lista completa, o novo arr [baixo] é arr [0], e o novo arr [alto] é o último arr [i-1] = arr [4-1] = arr [ARR [3], onde eu é o índice de pivô final da partição anterior. Depois que a função pivot () foi chamada, o novo valor do pivô, pivô = o. Não confunda entre a função pivô e o valor do pivô. A função pivô pode fazer uma pequena classificação e colocar o pivô à direita extrema da sub-lista. Esta sub-lista se torna,
Eu p e o
Com esse esquema, o pivô sempre termina na extremidade direita da sub-lista ou lista após sua chamada de função. A digitalização de ambas as extremidades começa no arr [0] e arr [3] até que eu e J nos conheço ou cruzem. A comparação é feita com pivô = o. As primeiras paradas estão em P e E. Eles são trocados e a nova sub-lista se torna:
Eu e P O
A digitalização de ambas as extremidades continua, e as novas paradas estão em P para i e em E para J. Agora eu e J nos conhecemos ou cruzamos. Portanto, a sub-lista permanece a mesma que:
Eu e P O
A partição de uma sub-lista ou lista termina quando o pivô foi colocado em sua posição final. Então, os novos valores para arr [i] e arr [alta] são trocados. Isto é, P e O são trocados. A nova sub-lista se torna:
Eu e o p
O está agora em sua posição final para toda a lista. Seu papel como pivô terminou. A sub-lista é atualmente particionada em mais três listas, que são:
Eu e o p
Neste ponto, um tipo rápido da primeira sub-lista à direita deve ser chamada. No entanto, não será chamado. Em vez disso, será observado e reservado, a ser chamado mais tarde. Como as declarações da função de particionamento estavam sendo executadas, a partir do topo da função, é do tipo rápido para a sub-lista esquerda que deve ser chamada agora (depois que o pivot () foi chamado). Será chamado para a lista:
Eu e
Vai começar procurando a mediana de eu e e. Aqui, arr [baixo] = i, arr [mid] = i e arr [alto] = e. Portanto, a mediana, pivô, deve ser determinada pelo algoritmo pivô como, eu. No entanto, o pseudocódigo de pivô acima determinará o pivô como e. Este erro ocorre aqui porque o pseudocódigo acima é destinado a três elementos e não dois. Na implementação abaixo, há algum ajuste no código. A sub-lista se torna,
E i
O pivô sempre termina na extremidade direita da sub-lista ou lista após sua chamada de função. A digitalização de ambas as extremidades começa no ARR [0] e ARR [1] exclusivo até que eu e J conheçam ou cruzem. A comparação é feita com pivô = eu. A primeira e única parada está em i e e: em i para i e em e para j. Agora eu e J nos conhecemos ou cruzamos. Então, a sub-lista permanece a mesma que:
E i
A partição de uma sub-lista ou lista termina quando o pivô foi colocado em sua posição final. Então, os novos valores para arr [i] e arr [alta] são trocados. Acontece aqui que arr [i] = i e arr [alto] = eu. Então, o mesmo valor é trocado por si mesmo. A nova sub-lista se torna:
E i
Agora estou em sua posição final para toda a lista. Seu papel como pivô terminou. A sub-lista agora é particionada em mais duas listas, que são,
E i
Agora, os pivôs até agora foram Q, O e eu. Pivôs terminam em suas posições finais. Uma sub-lista de um único elemento, como o P acima, também termina em sua posição final.
Neste ponto, a primeira sub-lista esquerda foi completamente classificada. E o procedimento de classificação está agora em:
E i o p q y u r w t
A primeira sub-lista à direita:
Você é
ainda precisa ser classificado.
Conquistando a primeira sub-lista direita
Lembre-se de que a chamada rápida para a primeira sub-lista à direita foi observada e reservada em vez de ser executada. Neste ponto, será executado. E assim, o novo arr [baixo] = arr [5] = arr [qpivotindex+1], e o novo arr [alto] permanece arr [9]. Um conjunto semelhante de atividades que aconteceram para a primeira sub-lista de esquerda acontecerá aqui. E esta primeira sub-lista à direita é classificada para:
R t u w y
E a lista original não classificada foi classificada para:
E i o p q r t u w y
Codificação Java
Colocar o algoritmo em Java é apenas para colocar todos os segmentos de pseudocódigo acima nos métodos Java em uma classe. Não se esqueça que precisa haver um método principal () na classe que chamará a função Quicksort () com a matriz não classificada.
O método pivot ()
O método java pivot () que retorna o valor, pivô, deve ser:
Void Pivot (char arr [], int baixo, int alto)O método swap ()
O método swap () deve ser:
Void Swap (char arr [], int x, int y)O método Quicksort ()
O método QuickSort () deve ser:
Void Quicksort (char arr [], int baixo, int alto)O método partition ()
O método partition () deve ser:
int partitio (char arr [], int baixo, int alto)O método principal ()
O método principal () pode ser:
public static void main (string [] args)Todos os métodos acima podem ser colocados em uma classe.
Conclusão
Quick Sort é um algoritmo de classificação que usa o paradigma de divisão e conquista. Começa dividindo uma lista não classificada em duas ou três sub-listas. Neste tutorial, o Quick Sort dividiu uma lista em três sub-listas: uma sub-lista esquerda, uma lista do meio de um único elemento e uma sub-lista direita. Conquistar em Quick Class. Este tutorial explicou uma implementação de classificação rápida na linguagem do computador Java.