Escolar Documentos
Profissional Documentos
Cultura Documentos
Merge Sort
Merge Sort
MergeSort
Escrito por volta de 1945
Criao atribudo ao matemtico
hngaro-americano John von Neumann
Um dos primeiros mtodos de
ordenao propostos
Utiliza a tcnica dividir para conquistar
(quebra um problema, em problemas
menores, recursivamente)
MergeSort - demonstrao
http://www.cse.iitk.ac.in/users/dsrkg/cs
210/applets/sortingII/mergeSort/mergeSor
t.html
MergeSort - tcnica
Ordenar um vetor A[p . . r]:
Dividir
Divide a sequncia de n elementos desordenados
em duas subsequncias de n/2 elementos cada
Conquistar
Ordena as subsequncias recursivamente usando
o MergeSort
Quando o tamanho das sequncias 1, no h
nada mais para fazer
Combinar
Mesclar as duas subsequncias ordenadas
MergeSort - tcnica
p
1
5 2
MERGE-SORT(A, p, r)
if p < r
Verifica o caso bsico
q (p + r)/2
Divide
MERGE-SORT(A, p, q)
Conquista
MERGE-SORT(A, q + 1, r) Conquista
MERGE(A, p, q, r)
Combina
Chamada inicial:
MERGE-SORT(A, 1, n)
Merge - ideia
Duas pilhas de cartas j ordenadas:
Escolha a menor carta entre as duas do topo;
Remova a carta menor e a coloque na pilha de sada,
voltada para baixo;
MergeSort (Exemplo) - 1
MergeSort (Exemplo) - 2
MergeSort (Exemplo) - 3
MergeSort (Exemplo) - 4
MergeSort (Exemplo) - 5
MergeSort (Exemplo) - 6
MergeSort (Exemplo) - 7
MergeSort (Exemplo) - 8
MergeSort (Exemplo) - 9
MergeSort (Exemplo) - 10
MergeSort (Exemplo) - 11
MergeSort (Exemplo) - 12
MergeSort (Exemplo) - 13
MergeSort (Exemplo) - 14
MergeSort (Exemplo) - 15
MergeSort (Exemplo) - 16
MergeSort (Exemplo) - 17
MergeSort (Exemplo) - 18
MergeSort (Exemplo) - 19
MergeSort (Exemplo) - 20
MergeSort (Exemplo) - 21
MergeSort (Exemplo) - 22
MergeSort - implementao
Existem duas formas de implementao:
In Place: a ordenao feita no prprio vetor de entrada
Double Storage: a ordenao feita com um outro vetor
temporrio, do mesmo tamanho do vetor de entrada.
MergeSort - cdigo
public static void mergesort(int[ ] data, int first, int n){
int n1; // Tamanho da primeira metade do vetor
int n2; // Tamanho da segunda metade do vetor
if (n > 1) {
// Calcula o tamanho das duas metades
n1 = n / 2;
n2 = n - n1;
// ordena data[first] at data[first+n1-1]
mergesort(data, first, n1);
// ordena data[first+n1] at o final
mergesort(data, first + n1, n2);
// mescla as duas metades ordenadas
merge(data, first, n1, n2);
}
}
MergeSort - cdigo
private static void merge(int[ ] data, int first, int n1, int n2) {
int[ ] temp = new int[n1+n2]; // Cria o vetor temporrio
// Nro de elementos copiados do vetor data para o vetor temp
int copied = 0;
// Nro de elementos copiados da primeira metade do vetor data
int copied1 = 0;
// Nro de elementos copiados da segunda metade do vetor data
int copied2 = 0;
// ndice p/ copiar elementos do vetor temp p/ o vetor data
int i;
// Mescla os elementos, copiando das duas metades do vetor
// data para o vetor temporrio.
while ((copied1 < n1) && (copied2 < n2)) {
if (data[first + copied1] < data[first + n1 + copied2])
temp[copied++] = data[first + (copied1++)];
else
temp[copied++] = data[first + n1 + (copied2++)];
}
}
MergeSort - complexidade
Melhor caso: O(n)
Quando os valores esto quase ordenados