03 - Merge Sort
Vamos olhar agora para a seguinte ideia:
- divida o vetor em duas metades
- ordene a metade da direita
- ordene a metade da esquerda
- combine as duas metades ordenadas tal que agora o vetor inteiro esteja ordenado
Juntando arrays já ordenados (MERGE)
Os passos acima claramente tem a ideia de um algoritmo recursivo: primeiro fazemos a ordenação (independente) de duas metades e depois combinando esses resultados. Logo, o único passo que ainda não está especificado o suficiente é o passo 4: combinar dois arrays ordenados em um único array ordenado.
Vamos começar tentando explicar como fazemos esse processo manualmente.
Exercício 1
Resposta
Uma resposta possível seria: "começamos com o primeiro elemento de A1 e vamos alternando pegar o próximo elemento de A2 e A1 até acabarem. A ordem de pegar os elementos fica "A1[0], A2[0], A1[1], A2[1], .....`.
Exercício 2
Resposta
Uma resposta possível seria: "Como os três primeiros de A1 são menores que o primeiro de A2, colocamos eles primeiro em A. Depois é só alternar entre A2[0], A1[3], A2[1] ...."
Exercício 3
Resposta
Uma resposta possível seria: "dessa vez começamos por A2, pegando os dois primeiros elementos. Então tomamos 3 de A1 e tem empate: podemos pegar os dois 5 em qualquer ordem. Por fim, o 7 de A1 é selecionado."
Agora que fizemos esse processo manualmente, vamos simular esse processo de maneira mais estruturada para um novo exemplo. Vamos determinar cada elemento de A no passo a passo, mostrando os valores intermediários de A1 e A2. Usaremos as seguintes variáveis:
A- array ordenado final,TAMANHO(A) = TAMANHO(A1) + TAMANHO(A2)A1eA2- sub arrays ordenadosK- índice deAque será preenchido na iteração atual. Começa em0I- índice do menor elemento deA1que ainda não foi colocado emA. Começa em0J- índice do menor elemento deA2que ainda não foi colocado emA. Começa em0
Na sequência de exercícios abaixo, só clique "Progress" após responder e entender a resposta correta.
Exercício 4
Resposta
Colocamos 1 em A, pois ele é o menor elemento dentre A1[I] e A2[J].
A = [ 1 VAZIO VAZIO VAZIO VAZIO VAZIO VAZIO VAZIO ]A1 = [ 4 4 7 8 ]A2 = [ 1 3 5 6 ]K = 1I = 0J = 1
Exercício 5
Resposta
Colocamos 3 em A, pois ele é o menor elemento dentre A1[I=0] e A2[J=1].
A = [ 1 3 VAZIO VAZIO VAZIO VAZIO VAZIO VAZIO ]A1 = [ 4 4 7 8 ]A2 = [ 1 3 5 6 ]K = 2I = 0J = 2
Exercício 6
Resposta
Colocamos 4 em A, pois ele é o menor elemento dentre A1[I=0] e A2[J=2].
A = [ 1 3 4 VAZIO VAZIO VAZIO VAZIO ]A1 = [ 4 4 7 8 ]A2 = [ 1 3 5 6 ]K = 3I = 1J = 2
Exercício 7
Resposta
Colocamos 4 em A, pois ele é o menor elemento dentre A1[I=1] e A2[J=2].
A = [ 1 3 4 4 VAZIO VAZIO VAZIO VAZIO ]A1 = [ 4 4 7 8 ]A2 = [ 1 3 5 6 ]K = 4I = 2J = 2
Exercício 8
Resposta
Colocamos 5 em A, pois ele é o menor elemento dentre A1[I=2] e A2[J=2].
A = [ 1 3 4 4 5 VAZIO VAZIO VAZIO ]A1 = [ 4 4 7 8 ]A2 = [ 1 3 5 6 ]K = 5I = 2J = 3
Exercício 9
Resposta
Colocamos 6 em A, pois ele é o menor elemento dentre A1[I=2] e A2[J=3].
A = [ 1 3 4 4 5 6 VAZIO VAZIO ]A1 = [ 4 4 7 8 ]A2 = [ 1 3 5 6 ]K = 6I = 2J = 4
Exercício 10
Resposta
Colocamos 7 em A, pois todos os elementos de A2 já foram colocados.
A = [ 1 3 4 4 5 6 7 VAZIO ]A1 = [ 4 4 7 8 ]A2 = [ 1 3 5 6 ]K = 7I = 3J = 4
Exercício 11
Resposta
Colocamos 8 em A, pois todos os elementos de A2 já foram colocados.
A = [ 1 3 4 4 5 6 7 8 ]A1 = [ 4 4 7 8 ]A2 = [ 1 3 5 6 ]K = 8I = 4J = 4
Acabamos a simulação quando chegamos ao fim de ambos A1 e A2. Note algumas coisas importantes:
- fizemos
N = TAMANHO(A)iterações. Em cada uma decidimos qual elemento deA1ouA2iria na posiçãoKdeA - É sempre válido que
K = I + J - Precisamos ter um array extra
Apara colocar o resultado mesclado.
Vamos agora sumarizar esse processo em um algoritmo "de verdade":
Exercício 12
Resposta
Faremos esse junto em sala. Use o botão "Editar" para ajeitar sua resposta após a discussão.
Algoritmo recursivo (Merge Sort)
Agora só falta formalizar o algoritmo inteiro. Vejamos:
Exercício 13
Implementação
Um pontos importante de uma implementação eficiente do MergeSort é gerenciar o array auxiliar AUX.
Exercício 14
Resposta
N = TAMANHO(A)
Exercício 15
Resposta
AUX seria criado N vezes, equivalente ao número de nós em uma árvore de altura $log_2 N$.
Leve em conta essas respostas ao implementar o MergeSort na APS03.