Se o comprimento da lista for 8, o índice para o elemento médio (médio) é considerado 3, ou seja, o quarto elemento - a contagem de índice começa de 0. Portanto, quando o comprimento da lista é uniforme, o índice para o elemento médio é de comprimento / 2 - 1.
Se o comprimento da lista for 5, o índice para o elemento médio será considerado 2, que é o terceiro elemento. Portanto, quando o comprimento da lista é ímpar, o índice para o elemento médio é de comprimento / 2 - 1/2.
Não é difícil obter o índice intermediário de uma lista com Java! - Basta usar aritmética inteira. A expressão para o índice médio é:
HighestIndex / 2Portanto, se o comprimento for 8, o índice mais alto, que é 7, é dividido por 2 para dar 3 e um 1/2. A aritmética inteira descarta a metade, deixando você com 3, que é, comprimento / 2 - 1.
Se o comprimento for 5, o índice mais alto, que é 4, é dividido por 2 para dar 2, que é, comprimento / 2 - 1/2.
Merge Sort é um algoritmo de classificação. Neste tutorial, a classificação resultará em uma lista final, do menos ao maior valor. Merge Sort usa o paradigma de divisão e conquista. O restante deste tutorial explica que, como se aplica a Java.
Conteúdo do artigo
Divida e conquista para a mesma classificação
Divida significa dividir a lista não classificada em duas metades, como explicado acima. Em seguida, divida cada uma das metades em mais duas metades. Continue dividindo as metades resultantes até que haja n listas de um elemento cada, onde n é o comprimento da lista original.
Conquer significa começar a emparelhar listas consecutivas em uma lista enquanto classifica a lista resultante. O emparelhamento continua até que uma lista final classificada de comprimentos que seja igual ao comprimento original seja obtida.
Considere a lista não classificada de cartas alfabéticas:
M k q c e t gA duração desta lista é 7. O diagrama a seguir ilustra como a classificação de mesclagem desta lista é feita em teoria:
Do diagrama, a divisão para valores únicos leva 3 etapas. A conquista, que está se fundindo e classificando, dá mais três etapas para ter a lista final classificada.
Se um programador escrever 6 segmentos de código para conseguir isso? - Não. O programador precisa ter um esquema de recursão usando uma lista temporária.
A propósito, observe que G parece bastante estranho em seu posicionamento para a divisão da primeira metade direita. Isso ocorre porque o comprimento da lista é um número ímpar, 7. Se o comprimento fosse um número par, digamos 6, Q teria parecido tão estranho de maneira semelhante para a divisão da primeira metade esquerda.
O restante deste artigo explica "Merge Sort in Java", usando a lista não classificada:
M k q c e t gO principal método de recursão
Existem três métodos neste programa. Os métodos são, o método divide (), o método conquer () e o método principal (). O método divide () é o principal método. Ele se chama repetidamente para as metades esquerda e direita e chama o método Conquer () no final de seu corpo. O código para o método principal é:
dividir void (char arr [], int Beg, int end)No início, leva a matriz dada, o índice de matriz inicial (Beg), que é 0, e o índice de matriz final, que é 6. O método não será executado se não tiver pelo menos dois elementos. A verificação é feita pela Condição IF: “Se (implorar < end)”. The first divide() recall calls the left half of the list, and the second divide() recall calls the right to half of the list.
Assim, para a primeira execução ou passagem, do método Divide (), a condição IF é satisfeita (mais de um elemento). O índice médio é 3 = (0 + 6) / 2 (aritmética inteira). As três chamadas de método e sua ordem com seus argumentos se tornam:
divida (arr, 0, 3);Existem três chamadas aqui. O primeiro dessas chamadas, chama o método Divide () novamente para a metade esquerda da lista. Os dois segundos métodos são observados e reservados em sua ordem, a serem executados mais tarde. A segunda chamada divide () chamaria o método divide () para a metade direita da lista. O método conquistador executaria as duas primeiras metades juntas.
Antes da segunda passagem do método Divide (), a lista deve ser considerada dividida em dois da seguinte maneira:
M k q c e t gNa segunda passagem do método Divide (), a metade esquerda da lista é atendida. A chamada para a segunda passagem é:
divida (arr, 0, 3);Desta vez, o índice médio é, 1 = (0 + 3) / 2 (aritmética inteira). O método chama, sua ordem e argumentos se tornam,
divida (arr, 0, 1);Observe que o novo índice final é 3, que é o fim da primeira metade à esquerda. O primeiro dessas chamadas, chama o método Divide () novamente para a metade esquerda da primeira metade esquerda da lista. Os segundos dois métodos são observados e reservados em sua ordem, a serem executados mais tarde, com seus novos argumentos. A segunda chamada divide () ligaria para o método divide () para a metade direita da primeira metade esquerda da lista. O método conquista () executaria as duas novas metades.
Antes da terceira passagem do método Divide (), a lista deve ser considerada dividida da seguinte forma:
M k q c e t gA terceira passagem do método de divisão é a chamada:
divida (arr, 0, 1);Nesta terceira passagem do método Divide (), a metade esquerda da nova sub-lista em questão é atendida. Desta vez, o índice médio é, 0 = (0 + 1) / 2 (aritmética inteira). O método chama, sua ordem e argumentos se tornam,
divida (arr, 0, 0);Observe que o novo índice final é 1, que é o fim da nova metade esquerda. A primeira dessas chamadas é,
divida (arr, 0, 0);Falha por causa da condição if, “se (implorar < end)” - beg, and end are the same, meaning there is only one element. The second divide() method,
divida (arr, 1, 1);Também falha por um motivo semelhante. Neste ponto, a lista deve ser considerada dividida como,
M k q c e t gA terceira chamada é:
conquista (arr, 0, 0, 1);A chamada conquistadora para as duas sub-listas é M e K, cada uma consistindo em um elemento. O método conquista () mescla e classifica duas sub-listas. A sub-lista resultante seria k m. A lista inteira se tornaria:
K m q c e t gLembre -se de que existem métodos, que foram observados e reservados. Eles seriam chamados em ordem inversa, agora com,
divida (arr, 2, 3);Esta é a quarta passagem do método Divide (). É para lidar com a sub-lista, Q C, cujo índice de partida é 2 e o índice final é 3. O índice médio é agora 2 = (2 + 3) / 2 (aritmética inteira). O método chama, sua ordem e argumentos se tornam,
divida (arr, 2, 2);O quinto passe do método Divide () é a chamada,
divida (arr, 2, 2);Observe que o índice de início e final é o mesmo, o que significa que há apenas um elemento. Esta chamada falha, por causa da condição if, “se (implorar < end)”. The second divide() call,
divida (arr, 3, 3);Também falha pelo mesmo motivo. Neste ponto, a lista deve ser considerada dividida como,
K m q c e t gA terceira chamada no passe do método é:
conquista (arr, 2, 2, 3);A chamada conquista para as duas sub-listas é Q e C, cada uma consistindo em um elemento. O método conquista () mescla e classifica duas sub-listas. A sub-lista resultante seria C q. A lista inteira se tornaria:
K m C q e t gLembre -se de que ainda existem métodos que foram observados e reservados. Eles continuariam a ser chamados na ordem inversa; agora com,
divida (arr, 4, 6);Esta é a sexta passagem do método Divide (). É para lidar com a sub-lista, e t g, cujo índice de partida é 4 e o índice final é 6. O índice médio é agora 5 = (4 + 6) / 2 (aritmética inteira). O método chama, sua ordem e argumentos se tornam,
divida (arr, 4, 5);O sétimo passe do método Divide () é a chamada,
divida (arr, 4, 5);As duas duas chamadas são anotadas e reservadas. Observe que o novo índice final é 5, que é o fim da nova metade esquerda. O índice médio agora é 4 = (4 + 5) / 2 (aritmética inteira). O método chama, sua ordem e argumentos se tornam,
divida (arr, 4, 4);A oitava passagem é:
divida (arr, 4, 4);Observe que o índice de início e final é o mesmo, o que significa que há apenas um elemento. Esta chamada falha, por causa da condição if, “se (implorar < end)”. The second divide() method call is,
divida (arr, 5, 5);Que também falha pelo mesmo motivo. Neste ponto, a lista deve ser considerada dividida como,
K m C q e t gA terceira chamada é:
conquista (arr, 4, 4, 5);É a chamada conquistadora para as duas sub-listas: E e T: a primeira sub-lista que consiste em um elemento, e a segunda sub-lista que consiste em um elemento. O método conquista () mescla e classifica duas sub-listas. A sub-lista resultante seria e g . A lista inteira se tornaria:
K m q c e t gEmbora a sequência e t permaneça a mesma, observe que a classificação está ocorrendo, embora o tipo final ainda esteja por vir.
Lembre -se de que ainda existem métodos que foram observados e reservados. Eles são chamados em ordem inversa. Eles agora serão chamados começando com,
divida (arr, 5, 6);Observe que o novo índice final é 6, que é o fim da nova metade direita. O índice médio é agora 5 = (5 + 6) / 2 (aritmética inteira). O método chama, sua ordem e argumentos se tornam,
divida (arr, 5, 5);As duas primeiras chamadas falham porque estão abordando sub-listas de elementos únicos. Neste ponto, toda a lista é:
K m q c e t gA próxima chamada é:
conquista (arr, 5, 5, 6);É a chamada conquistadora para as duas sub-listas: T e G: a primeira sub-lista que consiste em um elemento, e a segunda sub-lista que consiste em um elemento. O método conquista () mescla e classifica duas sub-listas. A sub-lista resultante seria GT . A lista inteira se tornaria:
K m q c e g tLembre -se de que ainda existem métodos que foram observados e reservados. Eles são chamados em ordem inversa. O próximo a ser chamado é,
conquista (arr, 0, 1, 3);É a chamada conquistadora para as duas sub-listas: km e q c: a primeira sub-lista que consiste em dois elementos, e a segunda sub-lista que consiste em dois elementos. O método conquista () mescla e classifica duas sub-listas. A sub-lista resultante seria C K m q. A lista inteira se tornaria:
C k m q e g tOutro método conquista () que foi observado e reservado é:
conquista (arr, 4, 5, 6);É o conquista que chama as duas sub-listas: e g e t. O método conquista () mescla e classifica duas sub-listas. A sub-lista resultante seria e g t. A lista inteira se tornaria:
C k m q e g tA última chamada conquista () observada e reservada é:
conquista (arr, 0, 3, 6);É a chamada conquistadora para as duas sub-listas: c k m q e e g t: a primeira sub-lista que consiste em quatro elementos, e a segunda sub-lista que consiste em três elementos. O método conquista () mescla e classifica duas sub-listas. A sub-lista resultante seria C e g k m q t, que é a sub-lista inteira, isto é:
C e g k m q tE isso termina a fusão e classificação.
O método conquista ()
O método conquistador mescla e classifica duas sub-listas. Uma sub-lista consiste em pelo menos um valor. O método conquistador toma como argumento, a matriz original, o índice de início da primeira sub-lista, o índice médio das duas sub-listas consecutivas vistas juntas e o índice final da segunda sub-lista. O método conquistador tem uma matriz temporária, cuja duração é a da matriz original. O código para o método conquistador é:
Void Conquer (Char arr [], int Beg, int Mid, int end)O principal método é:
public static void main (string [] args)O método Divide (), o método conquista () e o método principal () devem ser combinados em uma classe. A saída é:
C e g k m q tComo esperado.
Matriz temporária para o método conquista ()
À medida que os pares da sub-lista são classificados, o resultado é mantido na matriz temporária, temp []. O arranjo de valores na matriz temporária acaba substituindo o conteúdo da matriz original. A seguir, mostra o arranjo na matriz original e a da matriz temporária para as diferentes chamadas do método conquista ():
conquista (arr, 0, 0, 1);Conclusão
Merge Sort é um esquema de classificação que usa o paradigma de divisão e conquista. Ele divide uma lista de elementos em elementos únicos e depois começa a reunir pares consecutivos de sub-listas, classificados, começando pelas sub-listas de elemento único. Os procedimentos de divisão e conquista são feitos juntos. Este tutorial explicou como é feito em java.
Chrys