SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
Algoritmos de Ordenação: MergeSort
Projeto e Análise de Algoritmos
Delano M. Beder
Departamento de Computação (DC)
Universidade Federal de São Carlos
delano@dc.ufscar.br
10/2011
Estes slides estão protegidos por Licença Creative Commons
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 1 / 25
Projeto por Indução Forte
Hipótese de indução forte
Sabemos ordenar um conjunto de 1 ≤ k < n inteiros.
Caso base: n = 1. Um conjunto de um unico elemento está orde-
nado.
Passo da Indução (Primeira Alternativa): Seja S um conjunto
de n ≥ 2 inteiros. Podemos particionar S em dois conjuntos S1
e S2, de tamanhos n/2 e n/2 . Como n ≥ 2, ambos S1 e S2
possuem menos do que n elementos. Por hipótese de indução,
sabemos ordenar os conjuntos S1 e S2.
Podemos então obter S ordenado intercalando os conjuntos orde-
nados S1 e S2.
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 2 / 25
Projeto por Indução Forte
Esta indução dá origem ao algoritmo de divisão e conquista Mer-
geSort.
Na implementação do algoritmo, o conjunto S é um vetor de tama-
nho n.
A operação de divisão é imediata, o vetor é dividido em dois ve-
tores com metade do tamanho do original, que são ordenados re-
cursivamente.
O trabalho do algoritmo está concentrado na conquista: a interca-
lação dos dois subvetores ordenados.
Para simplificar a implementação da operação de intercalação e
garantir sua complexidade linear, usamos um vetor auxiliar.
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 3 / 25
Ordenação por Intercalação – MergeSort
Ordenação por intercalação/junção/fusão: mais conhecida como
MergeSort.
Dividir: divide a seqüência de n elementos a serem ordenados em
duas subseqüências de tamanho n/2 e n/2 .
Conquistar: ordena as duas subseqüências recursivamente por
intercalação.
Combinar: faz a intercalação das duas seqüências ordenadas de
modo a produzir a resposta ordenada.
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 4 / 25
Ordenação por Intercalação – MergeSort
Dividir é fácil. Basta dividir a seqüência em dois.
Conquistar também não é difícil.
Dividindo o problema em dois necessariamente vamos chegar a
uma seqüencia de tamanho um cuja ordenação é trivial.
Combinar, esse é o problema! Como combinar?
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 5 / 25
Fusão de Vetores
No livro [2], foi apresentado um método para fusão de vetores:
Fusão de Vetores
int [] fusao(int [] a, int [] b) {
int posa = 0,
posb = 0,
posc = 0;
int [] c = new int [a.length + b.length];
// Enquanto nenhuma das seqüências está vazia...
while (posa < a.length && posb < b.length) {
// Pega o menor elemento das duas seqüências
if(b[posb] <= a[posa]) {
c[posc] = b[posb];
posb++;
} else {
c[posc] = a[posa];
posa++;
}
posc++;
}
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 6 / 25
Fusão de Vetores (continuação)
Fusão de Vetores (continuação)
// Completa com a seqüência que ainda não acabou
while (posa < a.length) {
c[posc] = a[posa];
posc++;
posa++;
}
while (posb < b.length) {
c[posc] = b[posb];
posc++;
posb++;
}
return c; // retorna o valor resultado da fusão
}
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 7 / 25
Ordenação por Intercalação – MergeSort
Esse algoritmo não é exatamente o que desejamos. Ele retorna um
novo arranjo que contém a fusão.
O que queremos, no entanto, é realizar a fusão de subseqüências de
um vetor. Algo assim:
void merge(int [] A, int p, int q, int r) {
// A subseqüência A[p...q] está ordenada
// A subseqüência A[q+1...r] está ordenada
// Faz a junção das duas subseqüências
...
// A subseqüência A[p...r] está ordenada
}
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 8 / 25
Ordenação por Intercalação – MergeSort
Utilizando a mesma idéia da fusão de dois arranjos, com a assinatura
e restrições definidas acima, tem-se:
Fusão
void merge(int [] A, int p, int q, int r) {
// A subseqüência A[p...q] está ordenada
// A subseqüência A[q+1...r] está ordenada
1: int i, j, k;
// Faz cópias - seq1 = A[p...q] e seq2 = A[q+1...r]
2: int tamseq1 = q - p + 1; // tamanho da subseqüência 1
3: int tamseq2 = r - q; // tamanho da subseqüência 2
4: int [] seq1 = new int [tamseq1];
5: for(i=0; i < seq1.length; i++) {
seq1[i] = A[p+i];
}
6: int [] seq2 = new int [tamseq2];
7: for(j=0; j < seq2.length; j++) {
seq2[j] = A[q+j+1];
}
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 9 / 25
Ordenação por Intercalação – MergeSort
Fusão (Continuação)
// Faz a junção das duas subseqüências
8: k = p; i = 0; j = 0;
9: while (i < seq1.length && j < seq2.length) {
// Pega o menor elemento das duas seqüências
10: if(seq2[j] <= seq1[i]) {
11: A[k] = seq2[j];
12: j++;
}
else {
13: A[k] = seq1[i];
14: i++;
}
15: k++;
}
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 10 / 25
Ordenação por Intercalação – MergeSort
Fusão (Continuação 2)
// Completa com a seqüência que ainda não acabou
16: while (i < seq1.length) {
17: A[k] = seq1[i];
18: k++;
19: i++;
}
20: while (j < seq2.length) {
21: A[k] = seq2[j];
22: k++;
23: j++;
}
// A subseqüência A[p...r] está ordenada
}
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 11 / 25
Ordenação por Intercalação – MergeSort
Agora que já sabemos como combinar (merge), podemos terminar o
algoritmo de ordenação por intercalação:
void mergeSort(int [] numeros, int ini, int fim) {
if(ini < fim) {
//Divisao
1: int meio = (ini + fim)/2;
// Conquista
2: mergeSort(numeros, ini, meio);
3: mergeSort(numeros, meio+1, fim);
// Combinação
4: merge(numeros, ini, meio, fim);
}
// Solução trivial: ordenacao de um único número.
}
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 12 / 25
MergeSort
1. MergeSort (A, 0, 7)
2 8 7 1 3 5 6 4 ini = 0, fim = 7, meio = 3
1.1. MergeSort (A, 0, 3)
2 8 7 1 3 5 6 4 ini = 0, fim = 3, meio = 1
1.1.1. MergeSort (A, 0, 1)
2/2 8 7 1 3 5 6 4 ini = 0, fim = 1, meio = 0
1.1.1.1. MergeSort (A, 0, 0) ×
1.1.1.2. MergeSort (A, 1, 1) ×
1.1.1.3. Merge (A, 0, 1)
2 8 7 1 3 5 6 4
2 8 7 1 3 5 6 4
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 13 / 25
MergeSort
1.1.2. MergeSort (A, 2, 3)
2 8 7/7 1 3 5 6 4 ini = 2, fim = 3, meio = 2
1.1.2.1. MergeSort (A, 2, 2) ×
1.1.2.2. MergeSort (A, 3, 3) ×
1.1.2.3. Merge (A, 2, 3)
2 8 7 1 3 5 6 4
2 8 1 7 3 5 6 4
1.1.3. Merge (A, 0, 3)
2 8 1 7 3 5 6 4
1 2 7 8 3 5 6 4
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 14 / 25
MergeSort
1.2. MergeSort (A, 4, 7)
1 2 7 8 3 5 6 4 ini = 4, fim = 7, meio = 5
1.2.1. MergeSort (A, 4, 5)
1 2 7 8 3/3 5 6 4 ini = 4, fim = 5, meio = 4
1.2.1.1. MergeSort (A, 4, 4) ×
1.2.1.2. MergeSort (A, 5, 5) ×
1.2.1.3. Merge (A, 4, 5)
1 2 7 8 3 5 6 4
1 2 7 8 3 5 6 4
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 15 / 25
MergeSort
1.2.2. MergeSort (A, 6, 7)
1 2 7 8 3 5 6/6 4 ini = 6, fim = 7, meio = 6
1.2.2.1. MergeSort (A, 6, 6) ×
1.2.2.2. MergeSort (A, 7, 7) ×
1.2.2.3. Merge (A, 6, 7)
1 2 7 8 3 5 6 4
1 2 7 8 3 5 4 6
1.2.3. Merge (A, 4, 7)
1 2 7 8 3 5 4 6
1 2 7 8 3 4 5 6
1.3. Merge (A, 0, 7)
1 2 7 8 3 4 5 6
1 2 3 4 5 6 7 8
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 16 / 25
Análise da Fusão (Merge)
Complexidada temporal:
T(Linhas 1-3): O(1).
T(Linhas 4-7): O(seq1.length + seq2.length)
T(Linhas 9-23): O(seq1.length + seq2.length)
Como é uma seqüência,
⇒ T(1-23) = O(seq1.length + seq2.length) + O(seq1.length + seq2.length) + O(1)
⇒ T(1-23) = O(max(seq1.length + seq2.length, seq1.length + seq2.length, 1))
⇒ T(1-23) = O(seq1.length + seq2.length)
Se fizermos n1 = seq1.length e n2 = seq2.length
⇒ T(1-23) = O(n1 + n2).
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 17 / 25
Análise da ordenação por intercalação –
MergeSort
Ordenação por intercalação utiliza a abordagem dividir e conquis-
tar.
Então podemos antes fazer análise genérica dos algoritmos que
utilizam essa abordagem.
Dividir e conquistar envolve três passos:
1 Dividir
2 Conquistar
3 Combinar
Portanto, a complexidade de tempo de algoritmos dividir e con-
quistar para um entrada de tamanho n é:
T(n) = Dividir(n) + Conquistar(n) + Combinar(n).
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 18 / 25
Análise da ordenação por intercalação –
MergeSort
Para entradas pequenas, isto é, para n ≤ c, podemos assumir que
T(n) = O(1).
Vamos supor que o problema seja dividido em a subproblemas,
cada um com 1/b do tamanho original.
Se levamos D(n) para dividir o problema em subproblemas e C(n)
para combinar as soluções dados aos subproblemas, então tem-se
a recorrência T(n) tal que:
T(n) =
O(1) se n ≤ 0
aT(n/b) + D(n) + C(n) caso contrário
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 19 / 25
Análise da ordenação por intercalação –
MergeSort
Sem perda de generalidade, podemos supor que n é uma potência
de 2: n = 2i para i ≥ 0.
Para n = 1, isto é, a ordenação de um vetor com um único ele-
mento, a complexidade temporal é T(1) = O(1), pois é o caso
base e não requer fusão.
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 20 / 25
Análise da ordenação por intercalação –
MergeSort
Dividir: a etapa de dividir simplesmente calcula o ponto médio do
subvetor, o que demora um tempo constante.
D(n) = O(1)
Conquistar: resolvemos recursivamente dois subproblemas; cada
um tem o tamanho n/2
Contribui com 2T(n/2) para o tempo de execução
Combinar: Já foi calculado que o método merge em um subvetor
de tamanho n
C(n) = n1 + n2 é O(n).
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 21 / 25
Análise da ordenação por intercalação –
MergeSort
Portanto, a complexidade T(n) para o algoritmo de ordenação por in-
tercalação MergeSort é:
T(n) =
O(1) se n = 1
2T(n/2) + n − 1 caso contrário
Teorema Mestre (CLRS): temos que a = 2, b = 2 e f(n) = n.
Desta forma nlogb a = nlog2 2 = n1 = n.
Desde que f(n) ∈ Θ(nlog2 2) = Θ(n), nós podemos aplicar o caso 2 do
Teorema Mestre.
T(n) = Θ(nlogb a log n) = Θ(nlog2 2 log n) = Θ(n log n).
Logo, a solução é T(n) ∈ Θ(n log n).
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 22 / 25
Análise da ordenação por intercalação –
MergeSort
É possível fazer a intercalação dos subvetores ordenados sem o
uso de vetor auxiliar ? Sim! Basta deslocarmos os elementos de
um dos subvetores, quando necessário, para dar lugar ao mínimo
dos dois subvetores.
No entanto, a etapa de intercalação passa a ter complexidade
Θ(n2), resultando na seguinte recorrência:
T(n) =
O(1) se n = 1
2T(n/2) + n2 caso contrário
Ou seja, a complexidade do MergeSort passa a ser Θ(n2). Como
era de se esperar, a eficiência da etapa de intercalação é crucial
para a eficiência do MergeSort.
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 23 / 25
Referências
Referências utilizadas: [1] (páginas 21-48).
[1] T. H. Cormen, C. E. Leiserson, R. L. Rivest & C. Stein. Algoritmos -
Tradução da 2a. Edição Americana. Editora Campus, 2002.
[2] F. Kon, A. Goldman, P.J.S. Silva. Introdução à Ciência de Computa-
ção com Java e Orientado a Objetos, IME - USP, 2005.
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 24 / 25
Algoritmos de Ordenação: MergeSort
Projeto e Análise de Algoritmos
Delano M. Beder
Departamento de Computação (DC)
Universidade Federal de São Carlos
delano@dc.ufscar.br
10/2011
Estes slides estão protegidos por Licença Creative Commons
Delano M. Beder (DC - UFSCar) MergeSort 10/2011 25 / 25

Weitere ähnliche Inhalte

Was ist angesagt?

Obf2007 3 fase_3serie_teorica_gabarito
Obf2007 3 fase_3serie_teorica_gabaritoObf2007 3 fase_3serie_teorica_gabarito
Obf2007 3 fase_3serie_teorica_gabaritoKaroline Tavares
 
Asdl emmendes a1 fundamentos de sinais e sistemas
Asdl emmendes a1 fundamentos de sinais e sistemasAsdl emmendes a1 fundamentos de sinais e sistemas
Asdl emmendes a1 fundamentos de sinais e sistemasjoanes360
 
Coment obf nivel3_3fase
Coment obf nivel3_3faseComent obf nivel3_3fase
Coment obf nivel3_3faseThommas Kevin
 
cálculo 3 Integrais sobre regiões planas
cálculo 3 Integrais sobre regiões planascálculo 3 Integrais sobre regiões planas
cálculo 3 Integrais sobre regiões planasGilza Simão
 
Resolucao cadernoumseries
Resolucao cadernoumseriesResolucao cadernoumseries
Resolucao cadernoumseriesmanuel barros
 
Exercícios Resolvidos: Aplicação da integral
Exercícios Resolvidos: Aplicação da integralExercícios Resolvidos: Aplicação da integral
Exercícios Resolvidos: Aplicação da integralDiego Oliveira
 
Fisica 3 exercicios gabarito 27
Fisica 3 exercicios gabarito 27Fisica 3 exercicios gabarito 27
Fisica 3 exercicios gabarito 27comentada
 
Aplicações da Congruência Linear
Aplicações da Congruência LinearAplicações da Congruência Linear
Aplicações da Congruência Lineareellzziimmaarr
 
EQUAÇÃO EXPONENCIAL - Conceito e resolução
EQUAÇÃO EXPONENCIAL - Conceito e resoluçãoEQUAÇÃO EXPONENCIAL - Conceito e resolução
EQUAÇÃO EXPONENCIAL - Conceito e resoluçãobetontem
 

Was ist angesagt? (17)

Obf2007 3 fase_3serie_teorica_gabarito
Obf2007 3 fase_3serie_teorica_gabaritoObf2007 3 fase_3serie_teorica_gabarito
Obf2007 3 fase_3serie_teorica_gabarito
 
Potenciacao
PotenciacaoPotenciacao
Potenciacao
 
euclides primos
euclides primoseuclides primos
euclides primos
 
Ufba11fis2
Ufba11fis2Ufba11fis2
Ufba11fis2
 
2011matemática
2011matemática2011matemática
2011matemática
 
Asdl emmendes a1 fundamentos de sinais e sistemas
Asdl emmendes a1 fundamentos de sinais e sistemasAsdl emmendes a1 fundamentos de sinais e sistemas
Asdl emmendes a1 fundamentos de sinais e sistemas
 
Coment obf nivel3_3fase
Coment obf nivel3_3faseComent obf nivel3_3fase
Coment obf nivel3_3fase
 
cálculo 3 Integrais sobre regiões planas
cálculo 3 Integrais sobre regiões planascálculo 3 Integrais sobre regiões planas
cálculo 3 Integrais sobre regiões planas
 
Cad(2)
 Cad(2) Cad(2)
Cad(2)
 
Resolucao cadernoumseries
Resolucao cadernoumseriesResolucao cadernoumseries
Resolucao cadernoumseries
 
Exercícios Resolvidos: Aplicação da integral
Exercícios Resolvidos: Aplicação da integralExercícios Resolvidos: Aplicação da integral
Exercícios Resolvidos: Aplicação da integral
 
Fisica 3 exercicios gabarito 27
Fisica 3 exercicios gabarito 27Fisica 3 exercicios gabarito 27
Fisica 3 exercicios gabarito 27
 
Alg aula04
Alg aula04Alg aula04
Alg aula04
 
Aplicações da Congruência Linear
Aplicações da Congruência LinearAplicações da Congruência Linear
Aplicações da Congruência Linear
 
Gab potenciaraiz2010
Gab potenciaraiz2010Gab potenciaraiz2010
Gab potenciaraiz2010
 
EQUAÇÃO EXPONENCIAL - Conceito e resolução
EQUAÇÃO EXPONENCIAL - Conceito e resoluçãoEQUAÇÃO EXPONENCIAL - Conceito e resolução
EQUAÇÃO EXPONENCIAL - Conceito e resolução
 
81579842 metodo-cross-1
81579842 metodo-cross-181579842 metodo-cross-1
81579842 metodo-cross-1
 

Andere mochten auch

Tutorial aed iii 001 - algoritmo de ordenação shellsort
Tutorial aed iii   001 - algoritmo de ordenação shellsortTutorial aed iii   001 - algoritmo de ordenação shellsort
Tutorial aed iii 001 - algoritmo de ordenação shellsortFlávio Freitas
 
13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmosRicardo Bolanho
 
Ordenação de Dados por Distribuição de Chaves
Ordenação de Dados por Distribuição de ChavesOrdenação de Dados por Distribuição de Chaves
Ordenação de Dados por Distribuição de ChavesMauricio Volkweis Astiazara
 
Semana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetoresSemana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetoresPedro Valente
 
Metodo de Ordenação Selection sort
Metodo de Ordenação Selection sortMetodo de Ordenação Selection sort
Metodo de Ordenação Selection sortLeno Oliveira
 
Ordenação de vetores
Ordenação de vetoresOrdenação de vetores
Ordenação de vetoresalfredtaddeus
 
Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaDelacyr Ferreira
 
Análise de Algoritmos - Problemas, instâncias, algoritmos e tempo
Análise de Algoritmos - Problemas, instâncias, algoritmos e tempoAnálise de Algoritmos - Problemas, instâncias, algoritmos e tempo
Análise de Algoritmos - Problemas, instâncias, algoritmos e tempoDelacyr Ferreira
 
Análise de Algoritmos - As classes P e NP
Análise de Algoritmos - As classes P e NPAnálise de Algoritmos - As classes P e NP
Análise de Algoritmos - As classes P e NPDelacyr Ferreira
 
Análise de Algoritmos - Recursividade
Análise de Algoritmos - RecursividadeAnálise de Algoritmos - Recursividade
Análise de Algoritmos - RecursividadeDelacyr Ferreira
 
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Universidade de São Paulo
 

Andere mochten auch (17)

13 slides
13 slides13 slides
13 slides
 
Tutorial aed iii 001 - algoritmo de ordenação shellsort
Tutorial aed iii   001 - algoritmo de ordenação shellsortTutorial aed iii   001 - algoritmo de ordenação shellsort
Tutorial aed iii 001 - algoritmo de ordenação shellsort
 
13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmos
 
Ordenação de Dados por Distribuição de Chaves
Ordenação de Dados por Distribuição de ChavesOrdenação de Dados por Distribuição de Chaves
Ordenação de Dados por Distribuição de Chaves
 
Semana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetoresSemana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetores
 
Analise Algoritmos
Analise AlgoritmosAnalise Algoritmos
Analise Algoritmos
 
Metodo de Ordenação Selection sort
Metodo de Ordenação Selection sortMetodo de Ordenação Selection sort
Metodo de Ordenação Selection sort
 
Ordenação por inserção
Ordenação por inserçãoOrdenação por inserção
Ordenação por inserção
 
Ordenação de vetores
Ordenação de vetoresOrdenação de vetores
Ordenação de vetores
 
Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise Assintótica
 
Algoritmos de busca
Algoritmos de buscaAlgoritmos de busca
Algoritmos de busca
 
Análise de Algoritmos - Problemas, instâncias, algoritmos e tempo
Análise de Algoritmos - Problemas, instâncias, algoritmos e tempoAnálise de Algoritmos - Problemas, instâncias, algoritmos e tempo
Análise de Algoritmos - Problemas, instâncias, algoritmos e tempo
 
Análise de Algoritmos
Análise de AlgoritmosAnálise de Algoritmos
Análise de Algoritmos
 
Análise de Algoritmos - As classes P e NP
Análise de Algoritmos - As classes P e NPAnálise de Algoritmos - As classes P e NP
Análise de Algoritmos - As classes P e NP
 
Análise de Algoritmos - Recursividade
Análise de Algoritmos - RecursividadeAnálise de Algoritmos - Recursividade
Análise de Algoritmos - Recursividade
 
Ordenação
OrdenaçãoOrdenação
Ordenação
 
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
 

Ähnlich wie MergeSort: Algoritmo de Ordenação por Divisão e Conquista

Introducao a fisica - aula sobre vectores
Introducao a fisica - aula sobre vectoresIntroducao a fisica - aula sobre vectores
Introducao a fisica - aula sobre vectoresRodriguesAntonioNabo
 
Aula 7 a1 cap9 expansaotaylor
Aula 7 a1 cap9 expansaotaylorAula 7 a1 cap9 expansaotaylor
Aula 7 a1 cap9 expansaotaylorRobsoncn
 
Eletromagnetismo/Parte2
Eletromagnetismo/Parte2Eletromagnetismo/Parte2
Eletromagnetismo/Parte2alsppibr
 
Cálculo diferencial e integral de várias variáveis unid iii
Cálculo diferencial e integral de várias variáveis   unid iiiCálculo diferencial e integral de várias variáveis   unid iii
Cálculo diferencial e integral de várias variáveis unid iiiBruno Luz
 
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-FordGraph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-FordMichel Alves
 
Equações e enequações modulares.
Equações e  enequações modulares.Equações e  enequações modulares.
Equações e enequações modulares.Noely Menezes
 
guia-de-func3a7c3a3o-4a-parte-cc3a1lculo-integral2.doc
guia-de-func3a7c3a3o-4a-parte-cc3a1lculo-integral2.docguia-de-func3a7c3a3o-4a-parte-cc3a1lculo-integral2.doc
guia-de-func3a7c3a3o-4a-parte-cc3a1lculo-integral2.docShirleyCristinaCosta
 
Técnicas de integração
Técnicas de integraçãoTécnicas de integração
Técnicas de integraçãoCarlos Campani
 
19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracaoRicardo Bolanho
 
Tecnica de integracao resumo
Tecnica de integracao   resumoTecnica de integracao   resumo
Tecnica de integracao resumoJoão Bastos
 

Ähnlich wie MergeSort: Algoritmo de Ordenação por Divisão e Conquista (20)

Tecnicas integração
Tecnicas integraçãoTecnicas integração
Tecnicas integração
 
Aula 1 a 15 vol1
Aula 1 a 15 vol1Aula 1 a 15 vol1
Aula 1 a 15 vol1
 
Introducao a fisica - aula sobre vectores
Introducao a fisica - aula sobre vectoresIntroducao a fisica - aula sobre vectores
Introducao a fisica - aula sobre vectores
 
03 inducao i
03 inducao i03 inducao i
03 inducao i
 
GCET146 S14a.pdf
GCET146 S14a.pdfGCET146 S14a.pdf
GCET146 S14a.pdf
 
Eletrostática
EletrostáticaEletrostática
Eletrostática
 
Aula 7 a1 cap9 expansaotaylor
Aula 7 a1 cap9 expansaotaylorAula 7 a1 cap9 expansaotaylor
Aula 7 a1 cap9 expansaotaylor
 
Eletromagnetismo/Parte2
Eletromagnetismo/Parte2Eletromagnetismo/Parte2
Eletromagnetismo/Parte2
 
Cálculo diferencial e integral de várias variáveis unid iii
Cálculo diferencial e integral de várias variáveis   unid iiiCálculo diferencial e integral de várias variáveis   unid iii
Cálculo diferencial e integral de várias variáveis unid iii
 
Aula 04 p&e
Aula 04 p&eAula 04 p&e
Aula 04 p&e
 
M9fnemp gp
M9fnemp gpM9fnemp gp
M9fnemp gp
 
aula_04_cálculo_2.pptx
aula_04_cálculo_2.pptxaula_04_cálculo_2.pptx
aula_04_cálculo_2.pptx
 
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-FordGraph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
 
Equações e enequações modulares.
Equações e  enequações modulares.Equações e  enequações modulares.
Equações e enequações modulares.
 
guia-de-func3a7c3a3o-4a-parte-cc3a1lculo-integral2.doc
guia-de-func3a7c3a3o-4a-parte-cc3a1lculo-integral2.docguia-de-func3a7c3a3o-4a-parte-cc3a1lculo-integral2.doc
guia-de-func3a7c3a3o-4a-parte-cc3a1lculo-integral2.doc
 
Técnicas de integração
Técnicas de integraçãoTécnicas de integração
Técnicas de integração
 
19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracao
 
ajuste de curva
ajuste de curvaajuste de curva
ajuste de curva
 
m9fnemp_gp.pdf
m9fnemp_gp.pdfm9fnemp_gp.pdf
m9fnemp_gp.pdf
 
Tecnica de integracao resumo
Tecnica de integracao   resumoTecnica de integracao   resumo
Tecnica de integracao resumo
 

MergeSort: Algoritmo de Ordenação por Divisão e Conquista

  • 1. Algoritmos de Ordenação: MergeSort Projeto e Análise de Algoritmos Delano M. Beder Departamento de Computação (DC) Universidade Federal de São Carlos delano@dc.ufscar.br 10/2011 Estes slides estão protegidos por Licença Creative Commons Delano M. Beder (DC - UFSCar) MergeSort 10/2011 1 / 25
  • 2. Projeto por Indução Forte Hipótese de indução forte Sabemos ordenar um conjunto de 1 ≤ k < n inteiros. Caso base: n = 1. Um conjunto de um unico elemento está orde- nado. Passo da Indução (Primeira Alternativa): Seja S um conjunto de n ≥ 2 inteiros. Podemos particionar S em dois conjuntos S1 e S2, de tamanhos n/2 e n/2 . Como n ≥ 2, ambos S1 e S2 possuem menos do que n elementos. Por hipótese de indução, sabemos ordenar os conjuntos S1 e S2. Podemos então obter S ordenado intercalando os conjuntos orde- nados S1 e S2. Delano M. Beder (DC - UFSCar) MergeSort 10/2011 2 / 25
  • 3. Projeto por Indução Forte Esta indução dá origem ao algoritmo de divisão e conquista Mer- geSort. Na implementação do algoritmo, o conjunto S é um vetor de tama- nho n. A operação de divisão é imediata, o vetor é dividido em dois ve- tores com metade do tamanho do original, que são ordenados re- cursivamente. O trabalho do algoritmo está concentrado na conquista: a interca- lação dos dois subvetores ordenados. Para simplificar a implementação da operação de intercalação e garantir sua complexidade linear, usamos um vetor auxiliar. Delano M. Beder (DC - UFSCar) MergeSort 10/2011 3 / 25
  • 4. Ordenação por Intercalação – MergeSort Ordenação por intercalação/junção/fusão: mais conhecida como MergeSort. Dividir: divide a seqüência de n elementos a serem ordenados em duas subseqüências de tamanho n/2 e n/2 . Conquistar: ordena as duas subseqüências recursivamente por intercalação. Combinar: faz a intercalação das duas seqüências ordenadas de modo a produzir a resposta ordenada. Delano M. Beder (DC - UFSCar) MergeSort 10/2011 4 / 25
  • 5. Ordenação por Intercalação – MergeSort Dividir é fácil. Basta dividir a seqüência em dois. Conquistar também não é difícil. Dividindo o problema em dois necessariamente vamos chegar a uma seqüencia de tamanho um cuja ordenação é trivial. Combinar, esse é o problema! Como combinar? Delano M. Beder (DC - UFSCar) MergeSort 10/2011 5 / 25
  • 6. Fusão de Vetores No livro [2], foi apresentado um método para fusão de vetores: Fusão de Vetores int [] fusao(int [] a, int [] b) { int posa = 0, posb = 0, posc = 0; int [] c = new int [a.length + b.length]; // Enquanto nenhuma das seqüências está vazia... while (posa < a.length && posb < b.length) { // Pega o menor elemento das duas seqüências if(b[posb] <= a[posa]) { c[posc] = b[posb]; posb++; } else { c[posc] = a[posa]; posa++; } posc++; } Delano M. Beder (DC - UFSCar) MergeSort 10/2011 6 / 25
  • 7. Fusão de Vetores (continuação) Fusão de Vetores (continuação) // Completa com a seqüência que ainda não acabou while (posa < a.length) { c[posc] = a[posa]; posc++; posa++; } while (posb < b.length) { c[posc] = b[posb]; posc++; posb++; } return c; // retorna o valor resultado da fusão } Delano M. Beder (DC - UFSCar) MergeSort 10/2011 7 / 25
  • 8. Ordenação por Intercalação – MergeSort Esse algoritmo não é exatamente o que desejamos. Ele retorna um novo arranjo que contém a fusão. O que queremos, no entanto, é realizar a fusão de subseqüências de um vetor. Algo assim: void merge(int [] A, int p, int q, int r) { // A subseqüência A[p...q] está ordenada // A subseqüência A[q+1...r] está ordenada // Faz a junção das duas subseqüências ... // A subseqüência A[p...r] está ordenada } Delano M. Beder (DC - UFSCar) MergeSort 10/2011 8 / 25
  • 9. Ordenação por Intercalação – MergeSort Utilizando a mesma idéia da fusão de dois arranjos, com a assinatura e restrições definidas acima, tem-se: Fusão void merge(int [] A, int p, int q, int r) { // A subseqüência A[p...q] está ordenada // A subseqüência A[q+1...r] está ordenada 1: int i, j, k; // Faz cópias - seq1 = A[p...q] e seq2 = A[q+1...r] 2: int tamseq1 = q - p + 1; // tamanho da subseqüência 1 3: int tamseq2 = r - q; // tamanho da subseqüência 2 4: int [] seq1 = new int [tamseq1]; 5: for(i=0; i < seq1.length; i++) { seq1[i] = A[p+i]; } 6: int [] seq2 = new int [tamseq2]; 7: for(j=0; j < seq2.length; j++) { seq2[j] = A[q+j+1]; } Delano M. Beder (DC - UFSCar) MergeSort 10/2011 9 / 25
  • 10. Ordenação por Intercalação – MergeSort Fusão (Continuação) // Faz a junção das duas subseqüências 8: k = p; i = 0; j = 0; 9: while (i < seq1.length && j < seq2.length) { // Pega o menor elemento das duas seqüências 10: if(seq2[j] <= seq1[i]) { 11: A[k] = seq2[j]; 12: j++; } else { 13: A[k] = seq1[i]; 14: i++; } 15: k++; } Delano M. Beder (DC - UFSCar) MergeSort 10/2011 10 / 25
  • 11. Ordenação por Intercalação – MergeSort Fusão (Continuação 2) // Completa com a seqüência que ainda não acabou 16: while (i < seq1.length) { 17: A[k] = seq1[i]; 18: k++; 19: i++; } 20: while (j < seq2.length) { 21: A[k] = seq2[j]; 22: k++; 23: j++; } // A subseqüência A[p...r] está ordenada } Delano M. Beder (DC - UFSCar) MergeSort 10/2011 11 / 25
  • 12. Ordenação por Intercalação – MergeSort Agora que já sabemos como combinar (merge), podemos terminar o algoritmo de ordenação por intercalação: void mergeSort(int [] numeros, int ini, int fim) { if(ini < fim) { //Divisao 1: int meio = (ini + fim)/2; // Conquista 2: mergeSort(numeros, ini, meio); 3: mergeSort(numeros, meio+1, fim); // Combinação 4: merge(numeros, ini, meio, fim); } // Solução trivial: ordenacao de um único número. } Delano M. Beder (DC - UFSCar) MergeSort 10/2011 12 / 25
  • 13. MergeSort 1. MergeSort (A, 0, 7) 2 8 7 1 3 5 6 4 ini = 0, fim = 7, meio = 3 1.1. MergeSort (A, 0, 3) 2 8 7 1 3 5 6 4 ini = 0, fim = 3, meio = 1 1.1.1. MergeSort (A, 0, 1) 2/2 8 7 1 3 5 6 4 ini = 0, fim = 1, meio = 0 1.1.1.1. MergeSort (A, 0, 0) × 1.1.1.2. MergeSort (A, 1, 1) × 1.1.1.3. Merge (A, 0, 1) 2 8 7 1 3 5 6 4 2 8 7 1 3 5 6 4 Delano M. Beder (DC - UFSCar) MergeSort 10/2011 13 / 25
  • 14. MergeSort 1.1.2. MergeSort (A, 2, 3) 2 8 7/7 1 3 5 6 4 ini = 2, fim = 3, meio = 2 1.1.2.1. MergeSort (A, 2, 2) × 1.1.2.2. MergeSort (A, 3, 3) × 1.1.2.3. Merge (A, 2, 3) 2 8 7 1 3 5 6 4 2 8 1 7 3 5 6 4 1.1.3. Merge (A, 0, 3) 2 8 1 7 3 5 6 4 1 2 7 8 3 5 6 4 Delano M. Beder (DC - UFSCar) MergeSort 10/2011 14 / 25
  • 15. MergeSort 1.2. MergeSort (A, 4, 7) 1 2 7 8 3 5 6 4 ini = 4, fim = 7, meio = 5 1.2.1. MergeSort (A, 4, 5) 1 2 7 8 3/3 5 6 4 ini = 4, fim = 5, meio = 4 1.2.1.1. MergeSort (A, 4, 4) × 1.2.1.2. MergeSort (A, 5, 5) × 1.2.1.3. Merge (A, 4, 5) 1 2 7 8 3 5 6 4 1 2 7 8 3 5 6 4 Delano M. Beder (DC - UFSCar) MergeSort 10/2011 15 / 25
  • 16. MergeSort 1.2.2. MergeSort (A, 6, 7) 1 2 7 8 3 5 6/6 4 ini = 6, fim = 7, meio = 6 1.2.2.1. MergeSort (A, 6, 6) × 1.2.2.2. MergeSort (A, 7, 7) × 1.2.2.3. Merge (A, 6, 7) 1 2 7 8 3 5 6 4 1 2 7 8 3 5 4 6 1.2.3. Merge (A, 4, 7) 1 2 7 8 3 5 4 6 1 2 7 8 3 4 5 6 1.3. Merge (A, 0, 7) 1 2 7 8 3 4 5 6 1 2 3 4 5 6 7 8 Delano M. Beder (DC - UFSCar) MergeSort 10/2011 16 / 25
  • 17. Análise da Fusão (Merge) Complexidada temporal: T(Linhas 1-3): O(1). T(Linhas 4-7): O(seq1.length + seq2.length) T(Linhas 9-23): O(seq1.length + seq2.length) Como é uma seqüência, ⇒ T(1-23) = O(seq1.length + seq2.length) + O(seq1.length + seq2.length) + O(1) ⇒ T(1-23) = O(max(seq1.length + seq2.length, seq1.length + seq2.length, 1)) ⇒ T(1-23) = O(seq1.length + seq2.length) Se fizermos n1 = seq1.length e n2 = seq2.length ⇒ T(1-23) = O(n1 + n2). Delano M. Beder (DC - UFSCar) MergeSort 10/2011 17 / 25
  • 18. Análise da ordenação por intercalação – MergeSort Ordenação por intercalação utiliza a abordagem dividir e conquis- tar. Então podemos antes fazer análise genérica dos algoritmos que utilizam essa abordagem. Dividir e conquistar envolve três passos: 1 Dividir 2 Conquistar 3 Combinar Portanto, a complexidade de tempo de algoritmos dividir e con- quistar para um entrada de tamanho n é: T(n) = Dividir(n) + Conquistar(n) + Combinar(n). Delano M. Beder (DC - UFSCar) MergeSort 10/2011 18 / 25
  • 19. Análise da ordenação por intercalação – MergeSort Para entradas pequenas, isto é, para n ≤ c, podemos assumir que T(n) = O(1). Vamos supor que o problema seja dividido em a subproblemas, cada um com 1/b do tamanho original. Se levamos D(n) para dividir o problema em subproblemas e C(n) para combinar as soluções dados aos subproblemas, então tem-se a recorrência T(n) tal que: T(n) = O(1) se n ≤ 0 aT(n/b) + D(n) + C(n) caso contrário Delano M. Beder (DC - UFSCar) MergeSort 10/2011 19 / 25
  • 20. Análise da ordenação por intercalação – MergeSort Sem perda de generalidade, podemos supor que n é uma potência de 2: n = 2i para i ≥ 0. Para n = 1, isto é, a ordenação de um vetor com um único ele- mento, a complexidade temporal é T(1) = O(1), pois é o caso base e não requer fusão. Delano M. Beder (DC - UFSCar) MergeSort 10/2011 20 / 25
  • 21. Análise da ordenação por intercalação – MergeSort Dividir: a etapa de dividir simplesmente calcula o ponto médio do subvetor, o que demora um tempo constante. D(n) = O(1) Conquistar: resolvemos recursivamente dois subproblemas; cada um tem o tamanho n/2 Contribui com 2T(n/2) para o tempo de execução Combinar: Já foi calculado que o método merge em um subvetor de tamanho n C(n) = n1 + n2 é O(n). Delano M. Beder (DC - UFSCar) MergeSort 10/2011 21 / 25
  • 22. Análise da ordenação por intercalação – MergeSort Portanto, a complexidade T(n) para o algoritmo de ordenação por in- tercalação MergeSort é: T(n) = O(1) se n = 1 2T(n/2) + n − 1 caso contrário Teorema Mestre (CLRS): temos que a = 2, b = 2 e f(n) = n. Desta forma nlogb a = nlog2 2 = n1 = n. Desde que f(n) ∈ Θ(nlog2 2) = Θ(n), nós podemos aplicar o caso 2 do Teorema Mestre. T(n) = Θ(nlogb a log n) = Θ(nlog2 2 log n) = Θ(n log n). Logo, a solução é T(n) ∈ Θ(n log n). Delano M. Beder (DC - UFSCar) MergeSort 10/2011 22 / 25
  • 23. Análise da ordenação por intercalação – MergeSort É possível fazer a intercalação dos subvetores ordenados sem o uso de vetor auxiliar ? Sim! Basta deslocarmos os elementos de um dos subvetores, quando necessário, para dar lugar ao mínimo dos dois subvetores. No entanto, a etapa de intercalação passa a ter complexidade Θ(n2), resultando na seguinte recorrência: T(n) = O(1) se n = 1 2T(n/2) + n2 caso contrário Ou seja, a complexidade do MergeSort passa a ser Θ(n2). Como era de se esperar, a eficiência da etapa de intercalação é crucial para a eficiência do MergeSort. Delano M. Beder (DC - UFSCar) MergeSort 10/2011 23 / 25
  • 24. Referências Referências utilizadas: [1] (páginas 21-48). [1] T. H. Cormen, C. E. Leiserson, R. L. Rivest & C. Stein. Algoritmos - Tradução da 2a. Edição Americana. Editora Campus, 2002. [2] F. Kon, A. Goldman, P.J.S. Silva. Introdução à Ciência de Computa- ção com Java e Orientado a Objetos, IME - USP, 2005. Delano M. Beder (DC - UFSCar) MergeSort 10/2011 24 / 25
  • 25. Algoritmos de Ordenação: MergeSort Projeto e Análise de Algoritmos Delano M. Beder Departamento de Computação (DC) Universidade Federal de São Carlos delano@dc.ufscar.br 10/2011 Estes slides estão protegidos por Licença Creative Commons Delano M. Beder (DC - UFSCar) MergeSort 10/2011 25 / 25