Buscar

3-Ordenação-MergeSort1

Prévia do material em texto

Algoritmo MergeSort
Estrutura de Dados II
Prof Jairo Francisco de Souza
Intercalação
 Generalidades
  Intercalação é o processo através do qual diversos arquivos 
seqüenciais classifcados por um mesmo critério são 
mesclados gerando um único arquivo seqüencial                 
 Algoritmo Básico
 De cada um dos arquivos a intercalar basta ter em memória   
um  registro.  Considera-se cada arquivo como uma pilha, e o 
registro em memória seu topo
 Em cada iteração do algoritmo e leitura dos registros, o topo 
da pilha com menor  chave  é  gravado, e substituído pelo seu 
sucessor. Pilhas vazias têm topo igual a high value
 O algoritmo termina quando todos os topos da pilha tiverem 
high value
Intercalação
 Outra forma de intercalação é mesclar dois 
vetores (ordenados previamente)
 O resultado é um vetor ordenado, com os 
elementos dos vetores usados na mesclagem
11 33 55 55 77 99 99
Vetor 1
22 44 77 88
Vetor 2
11 22 33 44 55 55 77 77 88 99 99
Vetor_Resultado
Intercalação
 Inicialmente, para que aconteça a intercalação (ou merge), 
os elementos dos dois vetores devem ser copiados para 
apenas um vetor 
 Para execução do algoritmo de intercalação, o índice de 
início do segundo vetor e o tamanho do novo vetor devem 
ser encontrados
11 33 55 55 77 99 99 22 44 77 88
11 33 55 55 77 99 99
Vetor 1
22 44 77 88
Vetor 2
11 22 33 44 55 55 77 77 88 99 99
União dos Vetores
Inicio_Vet_2
Inicio Fim
Intercalação
Intercalação
 A intercalação deve ser usada também quando há 
necessidade de unir dados de dois arquivos de dados
 Desta maneira, os dados poderiam ser acessados por meio 
de suas estruturas
 Através de comandos de manipulação de arquivos, os dados 
entre os arquivos poderiam ser intercalados, gerando um 
novo arquivo de dados
 Neste caso, o desenvolvedor deve se preocupar 
principalmente com a coincidência de chaves primárias, e 
realizar o tratamento das transações problemáticas
Algoritmo de Intercalação
intercala (inteiro inicio_vet, inteiro inicio_vet_2, inteiro fim_vet, inteiro vetor[]) 
{
 inteiro indice_inicio, indice_inicio_vet_2, indice_aux;
 inteiro *vetor_aux;
 vetor_aux = (inteiro *) aloca_memoria (fim_vet * sizeof (inteiro));
 indice_inicio = inicio_vet;
 indice_inicio_vet_2 = inicio_vet_2;
 indice_aux = 0;
 Enquanto (indice_inicio < inicio_vet_2 e indice_inicio_vet_2 < fim_vet) 
 {
 Se (vetor[indice_inicio] <= vetor[indice_inicio_vet_2]) 
 { 
 vetor_aux [indice_aux] = vetor[indice_inicio];
 indice_aux = indice_aux + 1;
 indice_inicio = indice_inicio + 1;
 } senão { 
 vetor_aux [indice_aux] = vetor[indice_inicio_vet_2];
 indice_aux = indice_aux + 1;
 indice_inicio_vet_2 = indice_inicio_vet_2 + 1;
 }
 }
 
 Enquanto (indice_inicio < inicio_vet_2) {
 vetor_aux [indice_aux] = vetor[indice_inicio];
 indice_aux = indice_aux + 1;
 indice_inicio = indice_inicio + 1;
 }
 
 Enquanto (indice_inicio_vet_2 < fim_vet) {
 vetor_aux [indice_aux] = vetor[indice_inicio_vet_2];
 indice_aux = indice_aux + 1;
 indice_inicio_vet_2 = indice_inicio_vet_2 + 1;
 }
 
 Para (indice_inicio = inicio_vet; indice_inicio < fim_vet; indice_inicio++) {
 vetor[indice_inicio] = vetor_aux [indice_inicio - inicio_vet];
 }
 
 liberar_memoria (vetor_aux);
}
Intercalação usada para ordenação
 Algoritmo MergeSort utiliza a idéia de intercalação para 
ordenar registros.
 Algoritmo criado por von Neumann
 Complexidade O(NlogN) no caso médio e pior
 No pior caso é mais rápido do que o QuickSort
 Exemplo: Ordenar 10000 chaves:
 Algoritmos de O(N2): 100.000.000 comparações
 MergeSort: 40.000 comparações
MergeSort
A idéia central é unir dois arrays que já 
estejam ordenados. Ou seja, unir dois 
arrays A e B já ordenados e criar um terceiro 
array C que contenha os elementos de A e 
B já ordenados na ordem correta.
O foco inicial é no processo de junção dos 
arrays e posteriormente vamos trabalhar o 
processo de ordenação
Cenário
Considere que temos dois arrays já 
ordenados A e B que não precisam ser do 
mesmo tamanho onde A possui 4 elementos 
e B possui 6 elementos. Eles serão unidos 
para a criação de um array C com 10 
elementos ao final do processo de união
Cenário
23 47 81 95
7 14 39 55 62 74
7 14 23 39 47 55 62 74 81 95
23 < 7 ? 23 < 14 ? 47 < 39 ? 81 < 55 ? 81 < 62 ?
81 < 74 ?
Não há 
elementos 
em B
23 < 39 ? 47 < 55 ?
A
B
C
Ordenação
A idéia do método MergeSort é dividir um 
array ao meio, ordenar cada metade e 
depois unir estas duas metades novamente 
formando o array original, porém ordenado.
Como seria feita essa divisão e ordenação 
para que as metades possam ser unidas?
RECURSIVIDADE!
Ordenação
O algoritmo MergeSort
 O algoritmo divide a sequência original em pares de 
dados, classifcando e intercalando os elementos das 
partições
 Três passos são fundamentais para a execução do 
mergesort:
 Dividir: Dividir os dados em subsequências pequenas; 
 Conquistar: Classifcar as duas metades recursivamente 
aplicando o mergesort; 
 Combinar: Juntar as duas metades em um único conjunto já 
classifcado
O algoritmo MergeSort
 Dividir para conquistar
 O algoritmo é executado de forma recursiva
 Primeiro ordenar a primeira metade, em seguida a 
segunda metade
mergesort(inteiro *vetor,inteiro inicio,inteiro fim)
{
 inteiro meio;
 Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
}
O algoritmo MergeSort
 Considere o vetor abaixo:
26 69 25 53 59 27 41 0 33 16 35 43
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
26 69 25 53 59 27
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
26 69 25 53 59 27
26 69 25
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
53 59 27
25
26 69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
53 59 27
25
26 69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
53 59 27
26 69 25
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
53 59 27
26 69 25
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
53 59 27
25
26 69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
53 59 27
25
26 69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor,inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
53 59 27
25 26
69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
53 59 27
25 26 69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 6925 26 69 27
53 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 69 27
53 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 69
53 59 27
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 69
53 59 27
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 69 27
53 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 69 27 53
59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 69 27 53 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 69 27 53 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25
26 69 27 53 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25
26 69 27 53 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26
69 27 53 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 27
69 53 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 27 53
69 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 27 53
69 59
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 27 53 59
69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
41 0 33 16 35 43
25 26 27 53 59 69
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 41 0 33 16 35 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 16 35 43
41 0 33
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 16 35 43
33
41 0
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 16 35 43
33
41 0
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 16 35 43
33
41 0
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 16 35 43
0 41 33
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 16 35 43
0 41 33
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 16 35 43
0
41 33
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 16 35 43
0 33
41
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 16 35 43
0 33 41
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69
0 33 41 43
16 35
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69
0 33 41 43
16 35
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69
0 33 41 43
16 35
...
Se (inicio < fim) {
meio = (inicio + fim)/ 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69
0 33 41 43
16
35
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69
0 33 41
16 35
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
43
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69
0 33 41
16 35 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69
0 33 41 16
35 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69
0 33 41 16 35
43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69
0 33 41 16 35 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 0
33 41 16 35 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 0 16
33 41 35 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 0 16 33
41 35 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 0 16 33 35
41 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 0 16 33 35 41
43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
25 26 27 53 59 69 0 16 33 35 41 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0
25 26 27 53 59 69 16 33 35 41 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16
25 26 27 53 59 69 33 35 41 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16 25
26 27 53 59 69 33 35 41 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16 25 26
27 53 59 69 33 35 41 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16 25 26 27
53 59 69 33 35 41 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16 25 26 27 33
53 59 69 35 41 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16 25 26 27 33 35
53 59 69 41 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16 25 26 27 33 35 41
53 59 69 43
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16 25 26 27 33 35 41 43
53 59 69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16 25 26 27 33 35 41 43 53
59 69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Execução:
0 16 25 26 27 33 35 41 43 53 59
69
...
Se (inicio < fim) {
meio = (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
...
O algoritmo MergeSort
 Vetor Ordenado:
0 16 25 26 27 33 35 41 43 53 59 69
O algoritmo MergeSort
principal
{
 inteiro vetor[] = {7, 6, 5, 4, 8, 22, 3, 55, 7, 99, 11, 3, 1, 88};
 inteiro tamanho;
 inteiro indice;
//Pode-se usar a função sizeof()
 tamanho  tamanho_vetor / tamanho_de_um_inteiro; 
 
 mergesort(vetor, 0, tamanho);
}
 Implementação do algoritmo MergeSort:
O algoritmo MergeSort
 Implementação do algoritmo MergeSort:
mergesort(inteiro *vetor,inteiro inicio,inteiro fim)
{
 inteiro meio;
 Se (inicio < fim) {
meio  (inicio + fim) / 2;
 mergesort(vetor, inicio, meio);
 mergesort(vetor, meio+1, fim);
 intercala(vetor, inicio, meio, fim);
}
}
O algoritmo MergeSort
 Implementação do algoritmo MergeSort:
intercala(inteiro *vetor, inteiro inicio, inteiro meio, inteiro fim)
{
 inteiro indice_inicio;
 inteiro indice_meio;
 inteiro indice_aux;
 inteiro *vetor_aux;
 indice_inicio  inicio;
 indice_meio  meio+1;
 indice_aux  0;
 vetor_aux  alocacao_memoria(vetor); 
...
... 
//Continua no slide posterior
O algoritmo MergeSort
 Implementação do algoritmo MergeSort:
enquanto(indice_inicio < meio+1 ou indice_meio < fim+1) {
 se (indice_inicio = meio+1) {
 vetor_aux[indice_aux]  vetor[indice_meio];
 indice_meio  indice_meio + 1;
 indice_aux  indice_aux + 1;
 } senao se (indice_meio = fim+1) {
 vetor_aux[indice_aux]  vetor[indice_inicio];
 indice_inicio  indice_inicio + 1;
 indice_aux  indice_aux + 1;
 } senao se (vetor[indice_inicio] <= vetor[indice_meio]) {
 vetor_aux[indice_aux]  vetor[indice_inicio];
 indice_inicio  indice_inicio + 1;indice_aux  indice_aux + 1;
 } senao {
 vetor_aux[indice_aux]  vetor[indice_meio];
 indice_meio  indice_meio + 1;
 indice_aux  indice_aux + 1;
 }
 }
 ...
 //Continua no slide posterior
O algoritmo MergeSort
 Implementação do algoritmo MergeSort:
 // copia vetor intercalado para o vetor original
 para(indice_inicio = inicio;indice_inicio <= fim;indice_inicio=indice_inicio+1)
 vetor[indice_inicio]  vetor_aux[indice_inicio-inicio];
 libera_memoria(vetor_aux);
}
Estudo da estabilidade
 O algoritmo é considerado estável, pois não há a 
possibilidade de elementos iguais mudar de 
posição no processo de ordenação
 A fase de divisão do algoritmo não altera a posição 
de nenhuma chave
 Ordenação é feita pelo algoritmo de intercalação
 A intercalação é feita verificando, sequencialmente, os 
elementos de acordo com sua posição no array
 Dessa forma, elementos com mesma chave não terão a 
sua posição relativa alterada
	Slide 1
	Slide 2
	Slide 3
	Slide 4
	Slide 5
	Slide 6
	Slide 7
	MergeSort
	Cenário
	Slide 10
	Ordenação
	Slide 12
	Slide 13
	Slide 14
	Slide 15
	Slide 16
	Slide 17
	Slide 18
	Slide 19
	Slide 20
	Slide 21
	Slide 22
	Slide 23
	Slide 24
	Slide 25
	Slide 26
	Slide 27
	Slide 28
	Slide 29
	Slide 30
	Slide 31
	Slide 32
	Slide 33
	Slide 34
	Slide 35
	Slide 36
	Slide 37
	Slide 38
	Slide 39
	Slide 40
	Slide 41
	Slide 42
	Slide 43
	Slide 44
	Slide 45
	Slide 46
	Slide 47
	Slide 48
	Slide 49
	Slide 50
	Slide 51
	Slide 52
	Slide 53
	Slide 54
	Slide 55
	Slide 56
	Slide 57
	Slide 58
	Slide 59
	Slide 60
	Slide 61
	Slide 62
	Slide 63
	Slide 64
	Slide 65
	Slide 66
	Slide 67
	Slide 68
	Slide 69
	Slide 70
	Slide 71
	Slide 72
	Slide 73
	Slide 74
	Slide 75
	Slide 76
	Slide 77
	Slide 78
	Slide 79
	Slide 80
	Slide 81
	Slide 82
	Slide 83
	Slide 84

Continue navegando