Você está na página 1de 33

Merge Sort

Profa. Solange Barros

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;

Repita o processo at que uma das pilhas acabe


Pegue as cartas remanescentes da pilha de

entrada e as coloque voltadas para baixo na


pilha de sada

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 cdigo (cont.)


// Copia os elementos remanescentes dos sub-vetores da //
esquerda e da direita
while (copied1 < n1)
temp[copied++] = data[first + (copied1++)];
while (copied2 < n2)
temp[copied++] = data[first + n1 + (copied2++)];
// Copia de volta os dados do vetor temp para o vetor data
for (i = 0; i < n1+n2; i++)
data[first + i] = temp[i];
}

MergeSort - complexidade
Melhor caso: O(n)
Quando os valores esto quase ordenados

Pior caso: O(n log n )


Quando os dados esto desordenados / nmeros
aleatrios

Caso mdio: O(n log n )


o nico algoritmo de ordenao estvel (se
dois elementos so iguais eles nunca so
trocados de ordem) com complexidade O(n
log n )

Você também pode gostar