Você está na página 1de 11

1

Ordenao de Dados
(IV)
UFSC-CTC-INE
INE5384 - Estruturas de Dados
Prof. Ronaldo S. Mello
2002/2
MergeSort
MergeSort um mtodo particular de
ordenao
baseia-se em junes sucessivas (merge) de 2
seqncias ordenadas em uma nica seqncia
ordenada
Aplica um mtodo dividir para conquistar
divide o vetor em 2 segmentos (sub-vetores) de
comprimento n/2 e n/2
ordena recursivamente cada sub-vetor
(dividindo novamente, quando possvel)
faz o merge dos 2 sub-vetores ordenados para
obter o vetor ordenado completo
2
MergeSort - Exemplo
7 2 5 6 3 8 4 1
3 8 4 1 7 2 5 6
4 1 3 8 5 6 7 2
1 4 8 3 6 5 2 7
4 1 8 3 6 5
7 2
8 4 3 1 7 6 5 2
8 7 6 5 4 3 2 1
MergeSort - Juno ou Merge
Utiliza um vetor temporrio (Vtemp) para
manter o resultado da ordenao dos 2
sub-vetores
o mtodo no in-place
Vtemp deve ser um atributo da classe
OrdenadorMergeSort
Vtemp
4 1 8 3
8 4 3 1
3
MergeSort - Juno ou Merge
Aps a ordenao, o contedo de Vtemp
transferido para o vetor
... ... ... ... 8 4 3 1
... ... ... ... 3 2 1 0
Vtemp
4 1 8 3
8 4 3 1
3 2 1 0
Vetor
3 2 1 0
transfere os dados ordenados para
as mesmas posies do vetor
Vetor
MergeSort - Juno ou Merge
Nmero de comparaes?
mximo de comparaes: n - 1
Complexidade: O(n)
4 1 8 3
8 4 3 1
(1,3) 1
(4,3) 3
(4,8) 4
8
3 comparaes
para 4 elementos (n = 4)
8 4 3 1 7 6 5 2
8 7 6 5 4 3 2 1
(1,2) 1
(3,2) 2
(3,5) 3
(4,5) 4
(8,5) 5
(8,6) 6
(8,7) 7
8
7 comparaes
para n = 8
4
MergeSort - Mtodo Merge
Recebe 3 parmetros: esq, meio, dir
esq, meio e dir so posies do vetor que
delimitam 2 sub-vetores contguos ordenados
sub-vetor 1: [esq, meio]
sub-vetor 2: [meio+1, dir]
Ordena os 2 vetores em Vtemp
o resultado fica no intervalo [esq, dir] de Vtemp
Vtemp deve ter o mesmo comprimento do vetor
Transfere o intervalo [esq, dir] de Vtemp
para o intervalo [esq, dir] do vetor
MergeSort - Mtodo Merge
Exemplo: Merge(0, 1, 3)
... ... ... ... 8 4 3 1
... ... ... ... 3 2 1 0
Vtemp
4 1 8 3
8 4 3 1
3 2 1 0
Vetor
3 2 1 0
transfere Vtemp[0,3] para vetor[0,3]
esq = 0
meio = 1
dir = 3
sub-vetor1: [0, 1]
sub-vetor2: [2, 3]
5
MergeSort - Mtodo Ordena
um mtodo recursivo
recebe como parmetro os delimitadores do
vetor a ser ordenado (esq, dir)
no incio: ordena(0, n-1)
se o vetor tiver pelo menos 2 elementos
determina o meio do vetor (meio)
chama recursivamente ordena para os 2 sub-
vetores: ordena(esq, meio) e ordena(meio+1,dir)
realiza o merge dos 2 sub-vetores ordenados
MergeSort - Complexidade
1 4 8 3 6 5 2 7
4 1 8 3 6 5
7 2
8 4 3 1 7 6 5 2
8 7 6 5 4 3 2 1
n = 8
n / 4 - 1
comp.
n / 4 - 1
comp.
n / 4 - 1
comp.
n / 4 - 1
comp.
n / 2 - 1
comp.
n / 2 - 1
comp.
n - 1
comp.
n - 4
comp.
n - 2
comp.
n - 1
comp.
log
2
n

i = 1
n-2
i-1
O(n log n)
log
2
n
desconsiderando o
fator de subtrao de n
log
2
n . n
6
MergeSort
Simulao de funcionamento
http://math.hws.edu/TMCM/java/xSortLab
MergeSort - Comparao
O(n log n) O(n log n) O(n log n) Melhor caso
O(n log n) O(n log n) O(n log n) Caso mdio
O(n log n) O(n log n) O(n
2
) Pior caso
MergeSort HeapSort QuickSort
Classificando por melhor desempenho mdio:
1
0
) MergeSort (algoritmo mais simples)
2
0
) QuickSort
3
0
) HeapSort
7
Ordenao por Distribuio
No faz comparaes entre elementos para
realizar a ordenao (!)
No pode ser aplicado para a ordenao de
qualquer conjunto de dados
algumas restries devem ser atendidas
Ordenao em tempo linear (O(n)) (!)
Exemplos:
BucketSort
RadixSort
BucketSort
Restries
ordena somente elementos que so nmeros
inteiros
considera um pequeno conjunto de dados que
no ultrapassa um valor mximo pequeno m
valor dos elementos encontra-se no intervalo [0, m]
Exemplo
ordenao dos 80 empregados da empresa
pelo seu tempo de servio (em anos)
n = 80
m = 50
8
BucketSort - Funcionamento
Utiliza um vetor auxiliar (vOcor) que mantm o
nmero de ocorrncias de cada valor de elemento
Distribui os valores dos elementos
ordenadamente no vetor com base nos nmeros
de ocorrncias em vOcor
5 7 6 1 5 3 1 7
vetor
n = 8
m = 7
2 1 2 0 1 0 2 0
7 6 5 4 3 2 1 0
vOcor
7 7 6 5 5 3 1 1
vetor
Classe OrdenadorBucketSort
SubClasse de Ordenador
incio
m inteiro;
vOcor inteiro[ ];
construtor OrdenadorBucketSort (m inteiro);
incio
this.m m;
vOcor NOVO inteiro[m];
fim;
. . .
fim;
BucketSort - Implementao
9
BucketSort Mtodo Ordena
Inicializa o vetor de ocorrncias
(vOcor) com zero
Varre o vetor e contabiliza o nmero
de ocorrncias de cada elemento em
vOcor
Ordena o vetor com base no nmero
de ocorrncias em vOcor
BucketSort Etapa 1
Inicializa o vetor de ocorrncias
(vOcor) com zero
complexidade: O(m)
0 0 0 0 0 0 0 0
7 6 5 4 3 2 1 0
vOcor
10
BucketSort Etapa 2
Varre o vetor e contabiliza o nmero
de ocorrncias de cada elemento em
vOcor
complexidade: O(n)
5 7 6 1 5 3 1 7
vetor
2 1 2 0 1 0 2 0
7 6 5 4 3 2 1 0
vOcor
BucketSort Etapa 3
Ordena o vetor com base no nmero
de ocorrncias em vOcor
complexidade: O(m +n)
+n se refere ao loop que conta quantas
ocorrncias existem em cada posio de
vOcor e insere o elemento no vetor (o
total desta contagem n)
2 1 2 0 1 0 2 0
7 6 5 4 3 2 1 0
vOcor
7 7 6 5 5 3 1 1
vetor
11
BucketSort - Complexidade
Complexidades envolvidas:
O(m), O(n) e O(m+n)
Considerando que m deve ser pequeno,
sua complexidade assumida como
linear no nmero de dados (m = O(n))
Complexidade do BucketSort: O(n)
Exerccios
Implementar os seguintes mtodos para
a classe OrdenadorMergeSort:
ordena(esq inteiro, dir inteiro)
merge(esq inteiro, meio inteiro, dir inteiro)
Implementar para a classe
OrdenadorBucketSort:
ordena()