Você está na página 1de 23

Quicksort [1]

Provavelmente o algoritmo mais usado


inventado nos anos 60
muito estudado e analisado
desempenho bem conhecido
popular devido facilidade de implementao e eficincia
complexidade N log N, em mdia, para ordenar N objectos
ciclo interno muito simples e conciso
mas:
no estvel
quadrtico (N2) no pior caso!
frgil: qualquer pequeno erro de implementao pode no ser detectado mas
levar a ineficincia
Funo de ordenao do C (biblioteca) o qsort()
uma implementao do quicksort

AED (IST/DEEC) 57

Quicksort [2]
Algoritmo do tipo dividir para conquistar

Ideia chave: efectuar partio dos dados e ordenar as vrias partes


independentemente (de forma recursiva)
posicionamento da partio a efectuar depende dos dados de entrada
processo de partio crtico
algoritmo recursivo por natureza
uma vez efectuada a partio, cada uma das partes pode por sua vez ser
ordenada pelo mesmo algoritmo (o que implica nova partio dos dados)

Assuma os dados de entrada numa tabela a[...] de tamanho N

AED (IST/DEEC) 58
Quicksort [3]
void quicksort(Item a[], int l, int r)
{
int i;

if (r <= l) return;

i = partition(a, l, r);
quicksort(a, l, i-1);
quicksort(a, i+1, r);
}

AED (IST/DEEC) 59

Quicksort [4]
ASORTINGEXAMPLE
AAEETINGOXSMPLR
AAE
AA
A
LINGOPMRXTS
LIGMOPN
GIL
IL
I
NPO
OP
P
STX
TX
T
AAEEGILMNOPRSTX
AED (IST/DEEC) 60
Quicksort - Partio [1]
Processo de partio rearranja os dados de forma a que as trs condies
seguintes sejam vlidas (de a[l] a a[r]):
o elemento a[i], para algum i, fica, aps a partio, na sua posio final
nenhum dos elementos em a[l] a[i-1] maior do que a[i]
nenhum dos elementos em a[i+1] a[r] menor do que a[i]
Processo coloca pelo menos um elemento na sua posio final
possvel uma demonstrao por induo para o processo recursivo

Aps partio, a tabela fica sub-dividida em duas partes


(sub-tabelas) que podem ser ordenadas separadamente

Ordenao completa conseguida atravs de


partio + aplicao recursiva do algoritmo aos dois subconjuntos de dados da
resultantes

AED (IST/DEEC) 61

Quicksort - Partio [2]


Estratgia para a partio:
escolher a[r] arbitrariamente para ser o elemento de partio
o que colocado na posio final
percorrer a tabela a partir da esquerda at encontrar um elemento maior que
ou igual ao elemento de partio (a[r])
percorrer a tabela a partir da direita at encontrar um elemento menor que
ou igual ao elemento de partio (a[r])
estes dois elementos esto deslocados; trocamos as suas posies!
procedimento continua at nenhum elemento esquerda de a[r] ser maior
que ele, e nenhum elemento direita de a[r] ser menor que ele
termina quando ponteiros se cruzam
completa-se trocando a[r] com o elemento mais esquerda da sub-tabela da
direita

AED (IST/DEEC) 62
Quicksort - Partio [3]
ASORTINGEXAMPLE
AS
AMPL
AA SMPLE

O
EX
AAE OXSMPLE
R
ERTING

AAEETINGOXSMPLR

AED (IST/DEEC) 63

Quicksort - Partio [4]


Ciclo interno de Quicksort muito simples
incrementa um ndice (ponteiro) e compara um elemento de uma tabela com um
valor fixo
esta simplicidade o que faz o quicksort rpido
dificil imaginar um ciclo interno mais curto e simples num algoritmo de ordenao
Processo de partio no estvel
qualquer chave pode ser movida para trs de vrias outras chaves iguais a si (que
ainda no foram examinadas)
no conhecida nenhuma forma simples de implementar uma verso estvel de quicksort
baseada em tabelas
Procedimento tem de ser implementado cuidadosamente
no se deve chamar recursivamente se o ficheiro tiver tamanho 1
recurso acontece para valores estritamente menores que os de entrada
pode-se usar um teste explcito para ver se o elemento de partio o menor de
todo a tabela

AED (IST/DEEC) 64
Quicksort - Partio [5]
int partition(Item a[], int l, int r)
{
int i, j;
Questes:
Item v;
dever parar-se a busca em chaves
iguais a v?
v = a[r]; i = l-1; j = r;
Deveria haver sentinelas para
for (;;) {
testar os limites da tabela?
while (less(a[++i], v)) ;
Detalhes do cruzamento de
while (less(v, a[--j]))
if (j == l) break; ndices so muito importantes
if (i >= j) break;
exch(a[i], a[j]);
}
exch(a[i], a[r]);
return i;
}

a - tabela de elementos a ordenar; l, r - gama a ordenar; v - elemento de partio


i - ponteiro da esquerda para a direita; j - ponteiro da direita para a esquerda

AED (IST/DEEC) 65

Quicksort - Partio [6]


Quando h chaves duplicadas o cruzamento de ndices subtil
poder-se-ia parar o processo de partio se j < i, e usar j em vez de i-1 para
delimitar a extremidade direita da sub-tabela esquerda
deixar o algoritmo iterar mais uma vez vantajoso: ficamos com dois elementos (nas
posies i e j) que j esto nas posies finais
o elemento de partio e o elemento que acabou com a procura (igual aquele)
h vrias solues possveis sobre o que fazer quando os ndices de procura so
iguais ao elemento de partio
pode provar-se que o melhor parar a procura

Eficincia do processo de ordenao depende de quo bem a partio divide


os dados
depende por seu turno do elemento de partio
ser tanto mais equilibrada quanto mais perto este elemento estiver do meio da tabela
na sua posio final

AED (IST/DEEC) 66
Quicksort - Caractersticas [1]
Pode ser muito ineficiente em casos patolgicos

Propriedade: quicksort usa cerca de N2/2 comparaes no pior caso

Demonstrao: se o ficheiro j estiver ordenado, todas as parties degeneram e o


programa chama-se a si prprio N vezes; o nmero de comparaes de
N + (N-1) + (N-2) + + 2 + 1 = (N + 1) N / 2
(mesma situao se o ficheiro estiver ordenado por ordem inversa)

No apenas o tempo necessrio para a execuo do algoritmo cresce


quadraticamente como o espao necessrio para o processo recursivo de
cerca de N o que inaceitvel para ficheiros grandes

AED (IST/DEEC) 67

Quicksort - Caractersticas [2]

Melhor caso: quando cada partio divide o ficheiro de entrada exactamente


em metade
nmero de comparaes usadas por quicksort satisfaz a recurso de dividir
para conquistar

CN = 2 CN/2 + N
10 termo cobre o custo de ordenar os dois sub-ficheiros
20 termo refere-se a examinar cada elemento

soluo CN = N log N (vimos numa aula anterior)

AED (IST/DEEC) 68
Quicksort - Caractersticas [3]
Propriedade: quicksort usa cerca de 2N lg N comparaes em mdia

Demonstrao: A frmula de recorrncia exacta para o nmero de


comparaes utilizado por quicksort para ordenar N nmeros distintos
aleatoriamente posicionados e

1
CN = N + 1 + ( Ck 1 + CN k )
N 1k N
N 2, C0 = C1 = 0
termo N+1 cobre o custo de comparar o elemento de partio com os
restantes (2 comparaes extra: ponteiros cruzam-se)
resto vem do facto de que cada elemento tem probabilidade 1/N de ser o
elemento de partio aps o que ficamos com duas sub-tabelas de
tamanhos k-1 e N-k

AED (IST/DEEC) 69

Quicksort - Caractersticas [4]


Recurso anterior simples de resolver
ver livro
aproximadamente 2N lg N

Anlise assume que os dados esto aleatoriamente ordenados e tm


chaves diferentes
pode ser lento em situaes em que as chaves no so distintas ou que os
dados no esto aleatoriamente ordenados (como vimos)

Algoritmo pode ser melhorado


para reduzir a probabilidade que estes casos sucedam!
necessrio em ficheiros de grandes dimenses ou se o algoritmo for usado
como funo genrica numa biblioteca

AED (IST/DEEC) 70
Ordenao Sntese da Aula O5
Algoritmo quicksort
Ideia chave + Motivao
Algoritmo que recorre diviso em instncias menores divide and
conquer
Cdigo
Exemplo de aplicao
Descrio detalhada do mecanismo de partio
Anlise de eficincia
Pior caso
Melhor caso
Caso mdio

AED (IST/DEEC) 71

Quicksort - Caractersticas [5]


Caractersticas dinmicas: visualizao
partio divide em dois ficheiros que podem ser ordenados
independentemente
nenhum dos elementos para a esquerda do ponteiro de procura esquerda
maior que o elemento de partio
no h elementos acima e esquerda dele
nenhum dos elementos para a direita do ponteiro de procura direita
maior que ele
no h elementos abaixo e direita dele
elemento de partio est na diagonal
a sua posio final

AED (IST/DEEC) 72
Quicksort - Caractersticas [6]
Questes mais relevantes:
possvel reduo de desempenho devido ao uso de recurso
tempo de execuo dependente dos dados de entrada
tempo de execuo quadrtico no pior caso
um problema
espao/memria necessrio no pior caso linear
um problema srio (para ficheiros de grandes dimenses)
Problema do espao est associado ao uso de recurso:
recurso implica chamada a funo e logo a carregar dados na pilha/stack
do computador
no pior caso todas as parties degeneram e h O(N) nveis de recurso
pilha cresce at ordem N !!!

AED (IST/DEEC) 73

Quicksort - Espao necessrio [1]


No pior caso espao extra para a ordenao linear em N
inaceitvel, mas pode ser melhorado!
Exemplos: 1o - ficheiro parcialmente ordenado
2o e 3o - ficheiros aleatoriamente ordenados

AED (IST/DEEC) 74
Quicksort - Espao necessrio [2]
Usamos uma pilha (stack) explcita
pilha contm trabalho a ser processado, na forma de sub-tabelas a ordenar
quando precisamos de uma sub-tabela para processar tiramo-la da pilha (i.e.
fazemos um pop() do stack)
por cada partio criamos duas sub-tabelas e metemos ambas na pilha (i.e.
fazemos dois push() para o stack)
substitui a pilha do computador que usado na implementao recursiva
Conduz a uma verso no recursiva de quicksort()
verifica os tamanhos das duas sub-tabelas e pe a maior delas primeiro na
pilha (e a menor depois; logo a menor retirada e tratada primeiro)
ordem de processamento das sub-tabelas no afecta a correcta operao da
funo ou o tempo de processamento mas afecta o tamanho da pilha

AED (IST/DEEC) 75

Quicksort - Espao necessrio [3]

No pior caso espao extra para a ordenao logartmico em N


Exemplos: 1o - ficheiro parcialmente ordenado
2o e 3o - ficheiros aleatoriamente ordenados

Tempo de execuo continua a ser quadrtico no pior caso!

AED (IST/DEEC) 76
Quicksort - Verso no-recursiva [1]
#define push2(A, B) push(A); push(B);

void quicksort(Item a[], int l, int r)


{
int i;
stackinit(); push2(l, r);
while (!stackempty()) {
r = pop(); l = pop();
if (r <= l) continue;
i = partition(a, l, r);
if (i-l > r-i) {
push2(l, i-1); push2(i+1, r);
} else {
push2(i+1, r); push2(l, i-1);
}
}
}

AED (IST/DEEC) 77

Quicksort - Verso no-recursiva [2]


Poltica de colocar a maior das sub-tabelas primeiro na pilha
garante que cada entrada na pilha no maior do que metade da que estiver
antes dela na pilha
pilha apenas ocupa lg N no pior caso
que ocorre agora quando a partio ocorre sempre no meio da tabela
em ficheiros aleatrios o tamanho mximo da pilha bastante menor

Propriedade: se a menor das duas sub-tabelas ordenada primeiro a pilha


nunca necessita mais do que lg N entradas quando quicksort usado para
ordenar N elementos
Demonstrao: no pior caso o tamanho da pilha inferior a TN em que TN
satisfaz a recorrncia
TN = T N/2 + 1 (T0 = T1 = 0)
que foi j estudada anteriormente

AED (IST/DEEC) 78
Ordenao Sntese da Aula O6
Anlise do algoritmo quicksort

Descrio grfica da evoluo

Discusso relativa memria utilizada na verso recursiva

Alternativa de implementao por pilha e suas vantagens na


perspectiva da memria utilizada

Cdigo para quicksort em verso no recursiva

AED (IST/DEEC) 79

Quicksort - Melhoramentos [1]


Algoritmo pode ainda ser melhorado com alteraes triviais
porqu colocar ambas as sub-tabelas na pilha se uma delas de imediato
retirada?
Teste para r <= l feito assim que as sub-tabelas saem da pilha
seria melhor nunca as l ter colocado!
parece insignificante mas a natureza recursiva de quicksort garante que uma fraco
grande das sub-tabelas tero tamanho 0 ou 1
ordenao de ficheiros/sub-tabelas de pequenas dimenses pode ser efectuada de
forma mais eficiente
como escolher correctamente o elemento de partio?
Como melhorar o desempenho se os dados tiverem um grande nmero de chaves
repetidas?

De seguida veremos como efectuar alguns destes melhoramentos

AED (IST/DEEC) 80
Quicksort - Melhoramentos [2]
Pequenos ficheiros/sub-tabelas
um programa recursivo garantido instanciar-se a si prprio mltiplas vezes para
pequenos ficheiros!
conveniente utilizar o melhor mtodo possvel quando encontra tais ficheiros
forma bvia de obter este comportamento mudar o teste no incio da funo
recursiva para uma chamada a insertion sort
if (r-l <= M) insertion(a, l, r)
em que M um parmetro a definir na implementao
outra soluo a de simplesmente ignorar ficheiros pequenos (tamanho menor que M)
durante a partio:
if (r-l <= M) return;
neste caso no final teremos um ficheiro que est praticamente todo ordenado

boa soluo neste caso usar insertion sort


algoritmo hbrido: bom mtodo em geral!

AED (IST/DEEC) 81

Quicksort - Melhoramentos [3]


Utilizar um elemento de partio que com alta probabilidade divida o
ficheiro pela metade
pode-se usar um elemento aleatoriamente escolhido
evita o pior caso (I.e. pior caso tem baixa probabilidade de acontecer)
um exemplo de um algoritmo probabilstico
um que usa aleatoriedade para obter bom desempenho com alta probabilidade
independentemente dos dados de entrada
no caso de quicksort ter um gerador de nmeros aleatrios no se justifica
pode-se escolher alguns (ex: trs) elementos do ficheiro e usar a mediana dos trs
como elemento de partio
escolhendo os trs elementos da esquerda, meio e direita da tabela podemos incorporar
sentinelas na ordenao
ordenamos os trs elementos, depois trocamos o do meio com a[r-1] e corremos o algoritmo
de partio em a[l+1] a[r-2]
este melhoramento chama-se o mtodo da mediana de trs
median - of - three

AED (IST/DEEC) 82
Quicksort - Melhoramentos [4]
Mtodo da mdia de trs melhora quicksort por trs razes
o pior caso mais improvvel de acontecer na prtica
dois dos trs elementos teriam de ser dos maiores ou menores do ficheiro
e isto teria de acontecer constantemente a todos os nveis de partio
elimina o uso de uma sentinela para a partio
esta funo pode ser feita por um dos trs elementos analisados
reduz o tempo mdio de execuo do algoritmo
embora apenas por cerca de 5%
caso particular de mtodos em que se faz amostragem dos dados para estimar as suas
propriedades
junto com o mtodo de tratar de pequenos ficheiros pode dar ganhos de 20 a 25%

possvel pensar em outros melhoramentos mas o acrscimo de eficincia


marginal
ex: porque no fazer a mediana de cinco?

AED (IST/DEEC) 83

Quicksort - Melhoramentos [5]


Mtodo Standard
pode ter m (1a no exemplo) ou boa partio (2a no exemplo)

Tratamento de ficheiros pequenos

Mediana de trs

AED (IST/DEEC) 84
Quicksort - Melhoramentos [6]
bastante melhor do que parece!!

AED (IST/DEEC) 85

Quicksort - Estudo emprico


Quicksort bsico Quicksort melhorado

N shellsort M=0 M=10 M=20 M=0 M=10 M=20

12500 6 2 2 2 3 2 3
25000 10 5 5 5 5 4 6
50000 26 11 10 10 2 9 14
100000 58 24 22 22 25 20 28
200000 126 53 48 50 52 44 54
400000 278 116 105 110 114 97 118
800000 616 255 231 241 252 213 258

Quicksort cerca de 2 vezes mais rpido que shellsort para ficheiros grandes
aleatoriamente ordenados.
Usando insertion para pequenos ficheiros e a estratgia de mediana-de-trs
melhoram cada um a eficincia por um factor de 10%

AED (IST/DEEC) 86
Quicksort - Chaves duplicadas [1]
Ficheiros com um grande nmero de chaves duplicadas so frequentes
na prtica
desempenho de quicksort pode ser substancialmente melhorado
se todas as chaves forem iguais
quicksort mesmo assim faz N lg N comparaes
se houver duas chaves distintas
reduz-se ao problema anterior para cada sub-ficheiro
melhor completar a ordenao com uma nica partio
natureza recursiva de quicksort garante que haver frequentemente sub-
ficheiros de items com poucas chaves
uma possibilidade dividir o ficheiro em trs partes
cada uma para chaves menores, iguais e maiores que o elemento de partio
no trivial de implementar, sobretudo se se impuser que a ordenao dever
ser feita com apenas uma passagem pelos dados

AED (IST/DEEC) 87

Quicksort - Chaves duplicadas [2]


Soluo simples para este problema fazer uma partio em trs partes
manter chaves iguais ao elemento de partio que so encontradas no sub-ficheiro
da esquerda do lado esquerdo do ficheiro
manter chaves iguais ao elemento de partio que so encontradas no sub-ficheiro
da direita do lado direito do ficheiro

Quando os ponteiros/ndices de pesquisa se cruzam sabemos onde esto os


elementos iguais ao de partio e fcil coloc-los em posio
no faz exactamente tudo num s passo mas quase...
trabalho extra para chaves duplicadas proporcional ao nmero de chaves duplicadas:
funciona bem se no houver chaves duplicadas
linear quando h um nmero constante de chaves!!

AED (IST/DEEC) 88
Quicksort - Partio em trs [1]
#define eq(A,B) (!less(A,B) && !less(B,A))
void quicksort(Item a[], int l, int r)
{
int i, j, k, p, q;
Item v;
if (r <= l) return;
v = a[r]; i = l-1; j = r; p = l-1; q = r;
for (;;) {
while (less(a[++i], v)) ;
while (less(v, a[--j])) if (j == l) break;
if (i >= j) break;
exch(a[i], a[j]);
if (eq(a[i],v)) {
p++; exch(a[p],a[i]);
}
if (eq(v,a[j])) {
q--; exch(a[q],a[j]);
}
}
exch(a[i], a[r]); j = i-1; i = i+1;
for (k = l ; k < p; k++, j--) exch(a[k], a[j]);
for (k = r-1; k > q; k--, i++) exch(a[k], a[i]);
quicksort(a, l, j);
quicksort(a, i, r);
}

AED (IST/DEEC) 89

Seleco [1]
uma operao importante relacionada com ordenao mas para a
qual uma ordenao completa no necessria
exemplo calculo de mediana de um conjunto de dados
ou muitas outras operaes estatsticas ou de amostragem
com generalidade pode ser descrito como o problema de encontrar o
conjunto dos k-menor nmeros
ex: seja a tabela [ 15, 3, 47, 9, 12, 0 ]. O 3o menor elemento o 9

Um algoritmo para este problema o Selection sort


1o procura o menor elemento, depois o 2o menor, etc
se k for pequeno custo N k
h outros mtodos de custo N log k

Melhor soluo pode ser obtida usando a partio de quicksort


custo linear em mdia!

AED (IST/DEEC) 90
Seleco [2]
Partio coloca um elemento na sua posio final: i
elementos esquerda so menores que a[i]
elementos direita so maiores que a[i]

Dada a posio do k-simo menor elemento faz-se uma partio


se i = k, terminamos; se i > k continuamos no sub-ficheiro da direita; se i
< k continuamos no sub-ficheiro da esquerda

Propriedade: seleco baseada em quicksort linear em mdia

No pior caso, tempo de execuo quadrtico, como quicksort


ex: procurar o menor elemento num ficheiro j ordenado

AED (IST/DEEC) 91

Ordenao Sntese da Aula O7


Algoritmo quicksort
Melhoramentos na verso no recursiva
Mecanismos de partio alternativos
Aleatrios
Mediana de trs
Evoluo grfica comparativa dos melhoramentos
Estudo emprico de complexidade
Estratgia de melhoramento em presena de chaves duplicadas
Ideia base
Cdigo

O problema de seleco e sua relao com o problema da


ordenao

AED (IST/DEEC) 92
Juno versus partio [1]
Quicksort como vimos baseado na operao de seleco
fazer seleco semelhante a dividir um ficheiro em duas partes
efectuada uma partio e quando as duas metades do ficheiro
esto ordenadas, o ficheiro est ordenado
Operao complementar de juno ( merge )
combinar dois ficheiros para obter um, maior, ordenado
dividir os ficheiros em duas partes para serem ordenados e depois
combinar as partes de forma a que o ficheiro total fique ordenado
mergesort

Mergesort tem uma propriedade muito interessante:


ordenao de um ficheiro de N elementos feito em tempo
proporcional a N log N, independentemente dos dados!!

AED (IST/DEEC) 93

Juno de dois ficheiros ordenados [1]


Dados dois ficheiros combinamo-los para obter um nico ficheiro ordenado
em cada iterao um elemento retirado de a ou b e colocado em c
termina quando ambos os ficheiros de entrada foram lidos
trivial mas utiliza espao adicional proporcional aos dados!!

void merge(Item c[], Item a[], int N, Item b[], int M)


{
int i, j, k;

for (i = 0, j = 0, k = 0; k < N+M; k++) {


if (i == N) {
c[k] = b[j++]; continue;
}
if (j == M) {
c[k] = a[i++]; continue;
}
if (less(a[i], b[j]))
c[k] = a[i++]; else c[k] = b[j++];
}
}
AED (IST/DEEC) 94
Juno de dois ficheiros ordenados [2]
Implementao (aparentemente) sem espao adicional (in-place)
copiamos a e b para uma tabela extra c com b em ordenao revertida
c espao adicional mas no para quem chama funo (e pode ser evitado)
evita testes pelo fim das tabelas a e b
sequncia de chaves aumenta e depois diminui sequncia bitnica
Item aux[maxN];
void merge(Item a[], int l, int m, int r)
{
int i, j, k;
for (i = m+1; i > l; i--) aux[i-1] = a[i-1];
for (j = m; j < r; j++) aux[r+m-j] = a[j+1];
for (k = l; k <= r; k++)
if (less(aux[i], aux[j]))
a[k] = aux[i++];
else a[k] = aux[j--];
}
AED (IST/DEEC) 95

Juno de dois ficheiros ordenados [3]

ARSTGIN
ARSTNIG
ARSTNIGA
ARSTNI AG
ARSTN AGI
ARST AGIN
ARST AGINR
ARST AGINRS
ARS AGINRST

AED (IST/DEEC) 96
Mergesort
ASORTINGEXAMPLE
AS
ASOR
Ordenar um ficheiro: AORS
IT
ordenando duas GN
metades do mesmo GINT
(recursivamente) e AGINORST
EX
depois fazendo a AM
juno dos resultados AEMX
LP
ELP
AEELMPX
AAEEGILMNOPRSTX

AED (IST/DEEC) 97

Implementao de mergesort -
Verso recursiva (descendente)
Para ordenar um ficheiro (processo top-down mergesort)
divide-se em duas metades
ordenam-se essas metades (recursivamente)
faz-se a juno dos resultados

void mergesort(Item a[], int l, int r)


{
int m = (r+l)/2;

if (r <= l) return;
mergesort(a, l, m);
mergesort(a, m+1, r);
merge(a, l, m, r);
}
AED (IST/DEEC) 98
Mergesort - Propriedades
Complexidade garantidamente N log N
mas requer espao extra proporcional a N
dados apenas definem a ordem em que os elementos so processados
nas junes
complexidade garantida pode ser um problema
no pode haver nenhum caso melhor
no se pode adaptar consoante os dados
um algoritmo estvel
(se a juno o for)
propriedade que muitas vezes faz com que seja escolhido!
Normalmente implementado de forma a aceder aos dados
sequencialmente
por vezes o nico processo de acesso
muito usado para ordenao de listas ligadas

AED (IST/DEEC) 99

Implementao de mergesort -
Verso no-recursiva (ascendente)
Tal como em quicksort tambm h uma verso no-recursiva de
mergesort (computaes efectuadas por outra ordem)
sub-ficheiros so processados independentemente, logo junes
podem ser feitas numa sequncia diferente
mesmo conjunto de divises e de junes
apenas as junes so efectuadas por outra ordem
primeiro as de ficheiros com um elemento, depois as de 2 elementos, etc
em cada passo o tamanho dos sub-ficheiros ordenados duplica

Estratgia de dividir para conquistar substituda por


uma de combinar para conquistar (na prtica o mesmo)

Implementao: no livro...
AED (IST/DEEC) 100
Mergesort - Exemplo Grfico
Mergesort ascendente (cima) consiste numa srie de
passagens pelo ficheiro fazendo a juno de sub-ficheiros
ordenados at apenas existir um
Mergesort descendente (baixo) ordena a primeira metade
do ficheiro antes de prosseguir para a outra metade
(recursivamente)

AED (IST/DEEC) 101

Ordenao Sntese da Aula O8


Juno de tabelas como alternativa partio de tabelas
Operao de juno merge
Cdigo
Exemplo de aplicao
Algoritmo mergesort
Outra instncia de um algoritmo que utiliza a estratgia divide
and conquer
Exemplo de aplicao
Implementao em cdigo
Anlise de eficincia e outras propriedades
Evoluo grfica

AED (IST/DEEC) 102

Você também pode gostar