Classificação de dados por Intercalação: MergeSort
Prof. Alexandre Parra Carneiro da [email protected]
Principais Métodos
Classificação por Trocas
Classificação por Seleção
Classificação por Inserção
Classificação por Intercalação
Classificação por Intercalação
Caracteriza-se pela utilização do padrão de projeto Divisão e Conquista.
Idéia básica (MergeSort): é muito fácil criar uma seqüência ordenada a partir de duas outras também ordenadas.
Divisão e Conquista: MergeSort
Divisão: se S tem zero ou um elemento, retorna-se S (já está ordenado). Em qualquer outro caso (S tem pelo menos 2 elementos), removem-se todos os elementos de S e colocam-se em duas seqüências, S1 e S2, cada um contendo aproximadamente a metade dos elementos de S;
Recursão: ordena-se recursivamente as seqüências S1 e S2;
Conquista: os elementos são colocados de volta em S, unindo as seqüências S1 e S2 em uma seqüência ordenada.
Exemplo Divisão e Conquista (MergeSort)
85 24 63 45 17 31 96 50
9685 24 63 45 17 31 50
4585 24 63 17 31 96 50
2485 17 31 96 5063 45
(a) Fase de Divisão
24 85 45 63 17 31 50 96
17 3124 45 63 85 50 96
8524 634517 31 9650
85 24 63 45 17 31 96 50
(b) Fase de Conquista
Exemplo do Processo MergeSort
MergeSort: Junção ou Merge
Utiliza um vetor temporário (Vtemp) para manter o resultado da ordenação dos 2 sub-vetores.
MergeSort: Junção ou Merge
Após a ordenação, o conteúdo de Vtemp é transferido para o vetor.
MergeSort: Junção ou Merge
Número de operações críticas ?
MergeSort: Junção ou Merge
Visão Geral do Processo MergeSort
MergeSort (parte do pseudo-código)Algoritmo merge(S1,S2,S): { Entrada: Seqüências ordenadas S1 e S2 e uma seqüência vazia de S, todos
implementados como arranjos. } { Saída: Seqüência ordenada S contendo os elementos de S1 e S2. }
i j 0 enquanto i < S1.size() e j < S2.size() faça se S1.get(i) <= S2.get(j) então S.addLast(S1.get(j)) { copia o i-nésimo elemento de S1 para o final de S } i i + 1 senão S.addLAst(S2.get(j)) { copia o j-nésimo elemento de S2 para o final de S } j j + 1 fimse fimenquanto enquanto i < S1.size() faça { copia os elementos restantes de S1 para S } S.addLast(S1.get(i)) i i + 1 fimenquanto enquanto j < S2.size() faça { copia os elementos restantes de S2 para S } S.addLast(S2.get(j)) j j +1 fimenquanto
Exercício
Dado o vetor com as chaves [9 25 10 18 5 7 15 3], aplicar o método MergeSort para ordená-lo crescentemente.
MergeSort: Análise de Desempenho (1/4)
Cenário do Melhor Caso ??? Cenário do Pior Caso ??? Cenário do Caso Médio ???
MergeSort: Melhor Caso (2/4)
Característica: nunca é necessário trocar após comparações.
Quando isto ocorre !?
MergeSort: Pior Caso (3/4)
Característica: sempre é necessário trocar após comparações.
Quando isso ocorre !?
MergeSort: Caso Médio (4/4)
Característica: há necessidade de haver trocas após comparações.
Quando isso ocorre !?
Considerações Finais É possível implementar o Merge Sort utilizando
somente um vetor auxiliar ao longo de toda a execução, tornando assim a complexidade de espaço adicional igual a Θ(n).
É possível também implementar o algoritmo com espaço adicional Θ(1).
Algoritmo criado por Von Neumann.
Comprovado matematicamente que é praticamente impossível fazer um algoritmo mais eficiente.
Site sobre ordenação
http://math.hws.edu/TMCM/java/xSortLab/ BubbleSort QuickSort SelectionSort InsertionSort (Busca Seqüencial) MergeSort