Professional Documents
Culture Documents
Estruturas de Dados II
Ordenao
Ordenao parcial:
Seleo
Insero
Heapsort
Quicksort
Objetivos:
Apresentar os mtodos de ordenao mais importantes sob o ponto de
vista prtico
Mostrar um conjunto amplo de algoritmos para realizar uma mesma tarefa,
cada um deles com uma vantagem particular sobre os outros, dependendo
da aplicao
Cada mtodo:
ilustra o uso de estruturas de dados
mostra como a escolha da estrutura influi nos algoritmos
Objetivo da ordenao:
facilitar a recuperao posterior de elementos do conjunto ordenado.
Exemplos:
Listas telefnicas
Dicionrios
ndices de livros
Tabelas e arquivos
a k1 , a k2 , . . . , a kn
tal que, dada uma funo de ordenao f , tem-se a seguinte relao:
Qualquer tipo de campo chave, sobre o qual exista uma relao de ordem
total <, para uma dada funo de ordenao, pode ser utilizado.
Qualquer tipo sobre o qual exista uma regra de ordenao bem definida pode
ser utilizado.
Tipos usuais so o inteiro e seqncia de caracteres.
Exemplo:
Se uma lista alfabtica de nomes de funcionrios de uma empresa or-
denada pelo campo salrio, ento um mtodo estvel produz uma lista em
que os funcionrios com mesmo salrio aparecem em ordem alfabtica.
Exemplo:
12 7 10 5 4 15 9 8 ...
Requisito predominante:
Uso econmico da memria disponvel.
Logo, permutao dos itens in situ.
Outro requisito importante:
Economia do tempo de execuo.
Medidas de complexidade relevantes:
C(n): nmero de comparaes entre chaves
M (n): nmero de movimentos ou trocas de registros
Observao:
A quantidade extra de memria auxiliar utilizada pelo algoritmo tambm
um aspecto importante.
Os mtodos que utilizam a estrutura vetor e que executam a permutao
dos itens no prprio vetor, exceto para a utilizao de uma pequena tabela
ou pilha, so os preferidos.
Mtodos Eficientes:
Requerem menos comparaes
So mais complexos nos detalhes
Quantidade maior de dados.
Algoritmo executado vrias vezes.
Complexidade: C(n) = O(n log n)
var A : Vetor;
O tipo Vetor do tipo estruturado arranjo, composto por uma repetio do tipo
de dados Item.
Mtodos simples:
Ordenao por seleo.
Ordenao por insero.
Ordenao por permutao (Mtodo da Bolha).
Mtodos eficientes:
Ordenao por insero atravs de incrementos decrescentes (Shellsort).
Ordenao de rvores (Heapsort).
Ordenao por particionamento (Mergesort e Quicksort).
Exemplo:
Considere o problema de ordenar um baralho com 52 cartas no orde-
nadas.
Suponha que ordenar o baralho implica em colocar as cartas de acordo
com a ordem.
Exemplos:
Classificadoras de cartes perfurados utilizam o princpio da distribuio
para ordenar uma massa de cartes.
Carteiro no momento de distribuir as correspondncias por rua ou bairro
Anlise:
2
C(n) = 2 n
n
2 = O(n2 ).
Vantagens:
um dos mtodos mais simples de ordenao existentes.
Para arquivos com registros muito grandes e chaves pequenas, este deve
ser o mtodo a ser utilizado.
Com chaves do tamanho de uma palavra, este mtodo torna-se bastante
interessante para arquivos pequenos.
Desvantagens;
O fato do arquivo j estar ordenado no ajuda em nada pois o custo con-
tinua quadrtico.
O algoritmo no estvel, pois ele nem sempre deixa os registros com
chaves iguais na mesma posio relativa.
Princpio:
Em cada passo, a partir de i = 2, o i-simo elemento da seqncia fonte
apanhado e transferido para a seqncia destino, sendo inserido no seu
lugar apropriado.
Exemplo:
1 2 3 4 5 6
Chaves iniciais 44 12 55 42 94 18
i=2 12 44 55 42 94 18
i=3 12 44 55 42 94 18
i=4 12 42 44 55 94 18
i=5 12 42 44 55 94 18
i=6 12 18 42 44 55 94
Pior caso: Ci = i
Ci = i j=1 j = 1i ( i(i+1)
1 i+1
Pi
Caso mdio: 2 ) = 2
Consideraes:
C(n) = n
P
i=2 Ci.
Vamos assumir que para o caso mdio todas as permutaes de n so
igualmente provveis.
Pior caso:
Pn
i =
Pn
i 1 = n(n+1)
1 = n2 + n 1
i=2 i=1 2 2 2
Caso mdio:
Pi i+1
= 1 ( n(n+1) 1 + n 1) = n2 + 3n 1
i=2 2 2 2 4 4
Mi = Ci 1 + 3 = Ci + 2 (incluindo a sentinela)
Pn
Temos que M (n) = i=2 Mi, onde cada caso dado por:
Pn Pn
Melhor caso: i=2 (1 + 2) = i=2 3 = 3(n 1) = 3n 3
Pn Pn Pn
Pior caso: i=2 (i + 2) = i=2 i + i=2 2 =
n(n+1) n(n+1) n2 5n 3
2 1 + 2(n 1) = 2 + 2n 3 = 2 + 2
Caso mdio:
Pi
( i+1
+ 2) =
Pn i+1
+
Pn
2 = n2 + 11n 1
i=2 2 i=2 2 i=2 4 4
n2 n 36 6
C(n) = + 1= + 1 = 18 + 3 1 = 20
2 2 2 2
n2 5n 36 30
M (n) = + 3= + 3 = 18 + 15 3 = 30
2 2 2 2
Arquivos j ordenados:
Insero: algoritmo descobre imediatamente que cada item j est no seu
lugar (custo linear).
Seleo: ordem no arquivo no ajuda (custo quadrtico).
Comparaes:
Insero tem um nmero mdio de comparaes que aproximadamente
a metade da Seleo
Movimentaes:
Seleo tem um nmero mdio de comparaes que cresce linearmente
com n, enquanto que a mdia de movimentaes na Insero cresce com
o quadrado de n.
Princpio:
Chaves na posio 1 e 2 so comparadas e trocadas se estiverem fora de
ordem.
Processo repetido com as chaves 2 e 3, at n 1 e n.
begin
Lsup := n;
repeat
Bolha := 0;
for j := 1 to Lsup - 1 do
if A[j].Chave > A[j+1].Chave
then begin
Aux := A[j];
A[j] := A[j+1];
A[j+1] := Aux;
Bolha := j;
end:
Lsup := Bolha
until Lsup <= 1
end;
16 14 15 15 15 15 15 15 15 15 15 15 15 15
15 4 14 14 14 14 14 14 14 14 14 14 14 14
14 15 4 13 13 13 13 13 13 13 13 13 13 13
13 0 13 4 12 12 12 12 12 12 12 12 12 12
12 2 0 12 4 11 11 11 11 11 11 11 11 11
11 10 2 0 11 4 10 10 10 10 10 10 10 10
10 3 10 2 0 10 4 9 9 9 9 9 9 9
9 12 3 10 2 0 9 4 8 8 8 8 8 8
8 6 12 3 10 2 0 8 4 7 7 7 7 7
7 8 6 11 3 9 2 0 7 4 6 6 6 6
6 13 8 6 9 3 8 2 0 6 4 5 5 5
5 11 11 8 6 8 3 7 2 0 5 4 4 4
4 7 9 9 8 6 7 3 6 2 0 3 3 3
3 1 7 7 7 7 6 6 3 5 2 0 2 2
2 5 1 5 5 5 5 5 5 3 3 2 0 1
1 9 5 1 1 1 1 1 1 1 1 1 1 0
Lsup 15 13 12 11 10 9 8 7 6 5 2 1
Passos 1 2 3 4 5 6 7 8 9 10 11 12
Comparaes:
n2 3n
C(n) =
2 4
Movimentos:
3n2 3n
M (n) =
4 4
Mtodo lento:
S compara posies adjacentes.
Mtodo lento:
S compara posies adjacentes
Exemplo:
1 2 3 4 5 6
44 94 55 42 12 18
h=4 12 18 55 42 44 94 (15, 26)
h=2 12 18 44 42 55 94 (1:3, 2:4, 35, . . . )
h=1 12 18 42 44 55 94 (1:2, 2:3, . . . )
Comentrios:
Para h = 4, as posies 1 e 5, e 2 e 6 so comparadas e trocadas.
Para h = 2, as posies 1 e 3, 2 e 4, etc, so comparadas e trocadas se
estiverem fora de ordem.
Para h = 1, corresponde ao algoritmo de insero, mas nenhum item tem
que mover muito!
Vantagens:
Shellsort uma tima opo para arquivos de tamanho moderado
( 10000 itens).
Sua implementao simples e requer uma quantidade de cdigo pe-
quena.
Implementao simples.
Desvantagens:
O tempo de execuo do algoritmo sensvel ordem inicial do arquivo.
O mtodo no estvel.
Histria:
Proposto por C.A.R. Hoare (19591960) quando era um British Council Vis-
iting Student na Universidade de Moscou.
C.A.R. Hoare. Algorithm 63: Partition, Communications of the ACM,
4(7):321, 1961.
C.A.R. Hoare. Quicksort, The Computer Journal, 5:1015, 1962.
Idia bsica:
Partir o problema de ordenar um conjunto com n itens em dois problemas
menores.
Ordenar independentemente os problemas menores.
Combinar os resultados para produzir a soluo do problema maior (neste
caso, a combinao trivial).
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 48
Quicksort: Idia bsica
Aplicar a cada uma das duas parties geradas os dois passos anteriores.
Chamada inicial:
Quicksort(A, 1, n)
Comentrios:
Note que ao final da partio no foi feita uma ordenao nos itens que
ficaram em cada um dos dois sub-vetores, mas sim o rearranjo explicado
acima.
O processo de ordenao continua aplicando o mesmo princpio a cada um
dos dois sub-vetores resultantes, ou seja, A[Esq..i 1] e A[i + 1..Dir ].
Partio:
Percorra o vetor a partir da esquerda (Esq) at encontrar um item A[i] > x;
da mesma forma percorra o vetor a partir da direita (Dir ) at encontrar um
item A[j] < x.
Como os dois itens A[i] e A[j] esto fora de lugar no vetor final, eles devem
ser trocados.
O processo ir parar quando os elementos tambm so iguais a x
(melhora o algoritmo), apesar de parecer que esto sendo feitas trocas
desnecessrias.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A S O R T I N G E X A M P L E
i j
Piv
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A S O R T I N G E X A M P L E
A A S M P L E
i j Piv
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A S O R T I N G E X A M P L E
A A E O X S M P L E
i j Piv
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A S O R T I N G E X A M P L E
A A E E T I N G O X S M P L R
Esta situao ocorre quando cada partio divide o arquivo em duas partes
iguais.
T (1) = 2
T (n) = T (n 1) + n + 2
n
X n(n + 1)
T (n) = i+n+2= 1+n+2
i=2 2
n2 3n
= + +1
2 2
T (n) = O(n2)
1. Conquista (rearranja) vetor A[Esq..Dir ] de tal forma que o piv vai para sua
posio final A[i].
Observe que a partir deste ponto nenhum elemento esquerda do piv
trocado com outro elemento direita do piv e vice-versa.
3. Combina no faz nada j que o vetor A, ao final dos dois passos anteriores,
est ordenado.
Vantagens:
extremamente eficiente para ordenar arquivos de dados.
Necessita de apenas uma pequena pilha como memria auxiliar.
Requer cerca de n log n comparaes em mdia para ordenar n itens.
Desvantagens:
Tem um pior caso O(n2) comparaes.
Sua implementao muito delicada e deve ser feita com cuidado.
Um pequeno engano pode levar a efeitos inesperados para algumas
entradas de dados.
O mtodo no estvel.
Knuth, D.E. The Art of Computer Programming, Vol. 3: Sorting and Searching,
2nd ed. Reading, MA: Addison-Wesley, pp. 113-122, 1998.
Fila:
Sugere espera por algum servio.
Indica ordem de atendimento, que FIFO (F IRST-I N -F IRST-O UT).
Prioridade:
Sugere que servio no ser fornecido com o critrio FIFO.
Representada por uma chave que possui um certo tipo como, por exemplo,
um nmero inteiro.
Fila de prioridades:
uma fila de elementos onde o prximo item a sair o que possui a maior
prioridade.
Sistemas operacionais:
Chaves representam o tempo em que eventos devem ocorrer (por exemplo,
o escalonamento de processos).
Poltica de substituio de pginas na memria principal, onde a pgina a
ser substituda a de menor prioridade (por exemplo, a menos utilizada ou
a que est a mais tempo na memria).
Mtodos numricos:
Alguns mtodos iterativos so baseados na seleo repetida de um ele-
mento com o maior (menor) valor.
Sistemas de tempo compartilhado:
Projetista pode querer que processos que consomem pouco tempo possam
parecer instantneos para o usurio (tenham prioridade sobre processos
demorados).
Simulao:
A ordem do escalonamento dos eventos (por exemplo, uma ordem tempo-
ral).
Operao Construir:
Equivalente ao uso repetido da operao de Inserir.
Operao Alterar
Equivalente a Remover seguido de Inserir.
3. Heap Heapsort.
Heap:
Nome original lanado no contexto do Heapsort.
Posteriormente:
Garbage-collected storage em linguagens de programao, tais como
Lisp e Turbo Pascal/C/. . .
Z
Z
Z
da esquerda para a direita, onde o n
Z
Z
bk/2c pai do n k, para 1 < k n.
2
R
3Z
O
J
J
J
J J
As chaves na rvore satisfazem a
JJ JJ
4 5 6 7
E N A D
B
B
B
B
B
B
B
B
condio do heap:
Chave de cada n maior que as
B B B B
B B B B
J
J
J
J
S R O E N A D
J
J
JJ JJ
4 5 6 7
E N A D
B B B B
B B B B
B B B B
B B B B
Utilizao de arranjo:
Representao compacta.
Permite caminhar pelos ns da rvore facilmente fazendo apenas manipu-
lao de ndices.
Heap:
uma rvore binria completa na qual cada n satisfaz a condio do heap
apresentada.
No caso de representar o heap por um arranjo, a maior chave est sempre
na posio 1 do vetor.
R O
R O
B B B B
B B B B
B B B B
B B B B
i i
E
N A
D E
N U
D
S i
U
J
J
J
J
J
JJ JJ
i U
R R S
B B B B
B B B B
B B B B
B
B
B
B
E
N O D E
N O D
1 2 3 4 5 6 7
S R O E N A D
R N O E D A S
O N A E D R S
N E A D O R S
E D A N O R S
D A E N O R S
D A E N O R S
begin
Constroi(A, n) {Constri o heap}
Esq := 1;
Dir := n;
while Dir > 1 do {Ordena o vetor}
begin
x := A[1];
A[1] := A[Dir];
A[Dir] := x;
Dir := Dir - 1;
Refaz(Esq, Dir, A);
end;
end; {Heapsort}
Heapsort:
Tempo de execuo proporcional a O(n log n) no pior caso!
Mtodo Complexidade
Insero O(n2)
Seleo O(n2)
Shellsorta O(n log n)
Quicksortb O(n log n)
Heapsort O(n log n)
O mtodo estvel.
Deve ser usado para arquivos com registros muito grandes, desde que o
tamanho do arquivo no exceda 1000 elementos.
o mtodo a ser escolhido para a maioria das aplicaes por ser muito efi-
ciente para arquivos de tamanho moderado.
Mesmo para arquivos grandes, o mtodo cerca de apenas duas vezes mais
lento do que o Quicksort.
O pior caso tem uma probabilidade muito remota de ocorrer quando os ele-
mentos forem aleatrios.
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 105
Comparao entre os mtodos: Quicksort
Para isto, basta chamar um mtodo de ordenao simples nos arquivos pe-
quenos.
Apesar de ser cerca de duas vezes mais lento do que o Quicksort, no ne-
cessita de nenhuma memria adicional.
Essa estratgia pode ser utilizada para qualquer dos mtodos de ordenao
interna.
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 108
Ordenao parcial
Seleo parcial.
Insero parcial.
Heapsort parcial.
Quicksort parcial.
Princpio de funcionamento:
Selecione o menor item do vetor.
Troque-o com o item que est na primeira posio do vetor.
Repita estas duas operaes com os itens n 1, n 2 . . . n k.
M (n) = 3k
Pode ser obtido a partir do algoritmo de ordenao por Insero por meio de
uma modificao simples:
Tendo sido ordenados os primeiros k itens, o item da k-sima posio fun-
ciona como um piv.
Quando um item entre os restantes menor do que o piv, ele inserido
na posio correta entre os k itens de acordo com o algoritmo original.
Observaes:
procedure InsercaoParcial (var A : Vetor;
var n, k: Indice); 1. A modificao realizada veri-
{Nao o restante do vetor} fica o momento em que i se
var i, j: Indice; torna maior do que k e ento
x : Item; passa a considerar o valor de j
begin igual a k a partir deste ponto.
for i := 2 to n do 2. O algoritmo no preserva o
begin restante do vetor.
x := A[i];
if i > k then j := k else j := i - 1;
A[0] := x; {Sentinela}
while x.Chave < A[j].Chave do
begin
A[j + 1] := A[j];
j := j - 1;
end;
A[j+1] := x;
end;
end; {InsercaoParcial}
Utiliza um tipo abstrato de dados heap para informar o menor item do con-
junto.
Na primeira iterao, o menor item que est em A[1] (raiz do heap) trocado
com o item que est em A[n].
Repita as duas ltimas operaes at que o k-simo menor seja trocado com
A[n k].