You are on page 1of 128

Algoritmos e

Estruturas de Dados II

Ordenao

Antonio Alfredo Ferreira Loureiro


loureiro@dcc.ufmg.br
http://www.dcc.ufmg.br/~loureiro

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 1


Sumrio

Introduo: conceitos bsicos Ordenao externa:


Intercalao balanceada de
Ordenao Interna:
vrios caminhos
Seleo
Implementao por meio de se-
Insero
leo por substituio
Bolha
Consideraes prticas
Shellsort
Intercalao polifsica
Quicksort
Quicksort externo
Heapsort

Ordenao parcial:
Seleo
Insero
Heapsort
Quicksort

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 2


Consideraes iniciais

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

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 3


Definio e objetivos da ordenao

Ordenar corresponde ao processo de rearranjar um conjunto de objetos em


uma ordem especfica.

Objetivo da ordenao:
facilitar a recuperao posterior de elementos do conjunto ordenado.

Exemplos:
Listas telefnicas
Dicionrios
ndices de livros
Tabelas e arquivos

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 4


Observaes

Os algoritmos trabalham sobre os registros de um arquivo.

Apenas uma parte do registro, chamada chave, utilizada para controlar a


ordenao.

Alm da chave podem existir outros componentes em um registro, que no


tm influncia no processo de ordenar, a no ser pelo fato de que per-
manecem com a mesma chave.

O tamanho dos outros componentes pode influenciar na escolha do mtodo


ou na forma de implementao de um dado mtodo.

A estrutura de dados registro a indicada para representar os elementos a


serem ordenados.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 5


Notao

Sejam os os itens a1, a2, . . . , an.

Ordenar consiste em permutar estes itens em uma ordem

a k1 , a k2 , . . . , a kn
tal que, dada uma funo de ordenao f , tem-se a seguinte relao:

f (ak1 ) f (ak2 ) . . . f (akn )

Funo de ordenao definida sobre o campo chave.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 6


Notao

Qualquer tipo de campo chave, sobre o qual exista uma relao de ordem
total <, para uma dada funo de ordenao, pode ser utilizado.

A relao < deve satisfazer as condies:


Apenas um de a < b, a = b, a > b verdade
Se a < b e b < c ento a < c

A estrutura registro indicada para representar os itens ai.


type ChaveTipo = integer;
type Item = record
Chave : ChaveTipo;
{Outros componentes}
end;

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 7


Observaes

A escolha do tipo da chave como inteiro arbitrria.

Qualquer tipo sobre o qual exista uma regra de ordenao bem definida pode
ser utilizado.
Tipos usuais so o inteiro e seqncia de caracteres.

Outros componentes representam dados relevantes sobre o item.

Um mtodo de ordenao dito estvel, se a ordem relativa dos itens com


chaves iguais mantm-se inalterada pelo processo de ordenao.

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 8


Classificao dos mtodos de ordenao:
Ordenao interna

Nmero de registros a serem ordenados pequeno o bastante para que todo


o processo se desenvolva na memria interna (principal)
Qualquer registro pode ser acessado em tempo O(1)

Organiza os dados na forma de vetores, onde cada dado visvel

Exemplo:
12 7 10 5 4 15 9 8 ...

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 9


Ordenao interna

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 10


Classificao dos mtodos de ordenao:
Ordenao externa

Nmero de registros a ser ordenado maior do que o nmero que cabe na


memria interna.

Registros so armazenados em um arquivo em disco ou fita.

Registros so acessados seqencialmente ou em grandes blocos.


Apenas o dado de cima visvel.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 11


Mtodos para ordenao interna

Mtodos simples ou diretos:


Programas so pequenos e fceis de entender.
Ilustram com simplicidade os princpios de ordenao.
Pequena quantidade de dados.
Algoritmo executado apenas uma vez ou algumas vezes.
Complexidade: C(n) = O(n2)

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)

Eventualmente, pode ser necessria uma combinao dos dois mtodos no


caso de uma implementao eficiente
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 12
Tipos utilizados na implementao dos algoritmos

Na implementao dos algoritmos usaremos:


type Indice = 0..N;
Item = record
Chave : integer;
{outros componentes}
end;
Vetor = array [Indice] of Item;

var A : Vetor;

O tipo Vetor do tipo estruturado arranjo, composto por uma repetio do tipo
de dados Item.

O ndice do vetor vai de 0 at n, para poder armazenar chaves especiais


chamadas sentinelas.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 13


Mtodos de ordenao tratados no curso

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).

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 14


Mtodos de ordenao que utilizam o princpio de
distribuio

Mtodos que no fazem ordenao baseados em comparao de chaves.

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.

A < 2 < 3 < . . . < 10 < J < Q < K


e
<<<

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 15


Mtodos de ordenao que utilizam o princpio de
distribuio

Para ordenar por distribuio, basta seguir os passos abaixo:


1. Distribuir as cartas abertas em 13 montes, colocando em cada monte to-
dos os ases, todos os dois, todos os trs, . . . , todos os reis.
2. Colete os montes na ordem acima (s no fundo, depois os dois, etc), at
o rei ficar no topo.
3. Distribua novamente as cartas abertas em 4 montes, colocando em cada
monte todas as cartas de paus, todas as cartas de ouros, todas as cartas
de copas e todas as cartas de espadas.
4. Colete os montes na ordem indicada acima (paus, ouros, copas e es-
padas).

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 16


Mtodos de ordenao que utilizam o princpio de
distribuio

Mtodos baseados no princpio de distribuio so tambm conhecidos como


ordenao digital, radixsort ou bucketsort.

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

Dificuldades de implementar este mtodo:


Est relacionada com o problema de lidar com cada monte.
Se para cada monte reservada uma rea, ento a demanda por memria
extra pode se tornar proibitiva.

O custo para ordenar um arquivo com n elementos da ordem de O(n), pois


cada elemento manipulado algumas vezes.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 17


Ordenao por Seleo

Um dos algoritmos mais simples.


Princpio:
1. Seleciona o item com a menor chave;
2. Troca este item com o item A[1];
3. Repita a operao com os n 1 itens restantes, depois com os n 2
restantes, etc.
Exemplo (chaves sublinhadas foram trocadas de posio):
1 2 3 4 5 6
Chaves iniciais 44 12 55 42 94 18
i=1 12 44 55 42 94 18
i=2 12 18 55 42 94 44
i=3 12 18 42 55 94 44
i=4 12 18 42 44 94 55
i=5 12 18 42 44 55 94

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 18


Algoritmo Seleo
procedure Selecao (var A : Vetor);
var i, j, Min : Indice;
T : Item;
begin
for i:=1 to n-1 do
begin
Min := i;
for j:=i+1 to n do
if A[j].Chave < A[Min].Chave
then Min := j;
T := A[Min];
A[Min] := A[i];
A[i] := T;
end;
end; {Selecao}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 19


Anlise do algoritmo Seleo

O comando de atribuio Min := j


executado em mdia cerca de n log n vezes (Knuth, 1973).
Este valor depende do nmero de vezes que cj menor do que todas as
chaves anteriores c1, c2, . . . , cj1, quando estamos percorrendo as chaves
c1 , c 2 , . . . , c n .

Anlise:
2
C(n) = 2 n
n
2 = O(n2 ).

M (n) = 3(n 1) = O(n).

C(n) e M (n) independem da ordem inicial das chaves.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 20


Observaes sobre o algoritmo de Seleo

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 21


Ordenao por Insero

Mtodo preferido dos jogadores de cartas.

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.

Observao: caractersticas opostas ordenao por seleo.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 22


Ordenao por Insero

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

As chaves sublinhadas representam a seqncia destino.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 23


Ordenao por Insero

A colocao do item no seu lugar apropriado na seqncia destino realizada


movendo-se itens com chaves maiores para a direita e ento inserindo o item
na posio deixada vazia.

Neste processo de alternar comparaes e movimentos de registros existem


duas condies distintas que podem causar a terminao do processo:
Um item com chave menor que o item em considerao encontrado.
O final da seqncia destino atingido esquerda.

A melhor soluo para a situao de um anel com duas condies de termi-


nao a utilizao de um registro sentinela:
Na posio zero do vetor colocamos o prprio registro em considerao.
Para isso, o ndice do vetor tem que ser definido para a seqncia 0..n.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 24


Algoritmo de Insero
procedure Insercao (var A : Vetor);
var i, j : Indice;
T : Item;
begin
for i:=2 to n do
begin
T := A[i];
j := i-1;
A[0] := T; {Sentinela esquerda}
while T.Chave < A[j].Chave do
begin
A[j+1] := A[j];
j := j - 1;
end;
A[j+1] := T;
end;
end; {Insercao}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 25


Anlise de Insero: Comparaes

Anel mais interno (while): i-simo deslocamento:


Melhor caso: Ci = 1

Pior caso: Ci = i

Ci = i j=1 j = 1i ( i(i+1)
1 i+1
Pi
Caso mdio: 2 ) = 2

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 26


Anlise de Insero: Comparaes

Consideraes:
C(n) = n
P
i=2 Ci.
Vamos assumir que para o caso mdio todas as permutaes de n so
igualmente provveis.

Cada caso dado por:


Pn
Melhor caso: i=2 1 = n 1

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

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 27


Anlise de Insero: Movimentaes

O nmero de movimentaes na i-sima iterao :

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

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 28


Insero: Pior caso
0 1 2 3 4 5 6 # de comp.
6 5 4 3 2 1
i=2 5 5 6 4 3 2 1 2
i=3 4 4 5 6 3 2 1 3
i=4 3 3 4 5 6 2 1 4
i=5 2 2 3 4 5 6 1 5
i=6 1 2 3 4 5 6 1 6
20 (total)

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

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 29


Observaes sobre o algoritmo de Insero

O nmero mnimo de comparaes e movimentos ocorre quando os itens


esto originalmente em ordem.
O nmero mximo ocorre quando os itens esto originalmente na ordem re-
versa, o que indica um comportamento natural para o algoritmo.
Para arquivos j ordenados o algoritmo descobre, a um custo O(n), que cada
item j est no seu lugar.
Utilizao:
O mtodo de insero o mtodo a ser utilizado quando o arquivo est
quase ordenado.
tambm um bom mtodo quando se deseja adicionar poucos itens a um
arquivo j ordenado e depois obter um outro arquivo ordenado, com custo
linear.
O mtodo estvel pois deixa os registros com chaves iguais na mesma
posio relativa.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 30


Insero Seleo

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).

Adicionar alguns itens a um arquivo j ordenado:


Mtodo da insero o mtodo a ser usado em arquivos quase ordena-
dos.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 31


Insero Seleo

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 32


Comentrios sobre movimentaes de registros

Para registros grandes com chaves pequenas, o grande nmero de movimen-


taes na Insero bastante prejudicado.

No outro extremo, registros contendo apenas a chave, temos como objetivo


reduzir o nmero de comparaes, principalmente se a chave for grande.
Nos dois casos, o tempo da ordem de n2, para n suficientemente grande.

Uma forma intuitiva de diminuir o nmero mdio de comparaes na Insero


adotar uma pesquisa binria na parte j ordenada do arquivo.
Isto faz com que o nmero mdio de comparaes em um sub-arquivo de
k posies seja da ordem de log2 k, que uma reduo considervel.
Isto resolve apenas metade do problema, pois a pesquisa binria s diminui
o nmero de comparaes, j que uma insero continua com o mesmo
custo.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 33


Mtodo da Bolha

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.

Se desenharmos o vetor de armazenamento verticalmente, com A[n] em


cima e A[1] embaixo, durante um passo do algoritmo, cada registro sobe
at encontrar outro com chave maior, que por sua vez sobe at encontrar
outro maior ainda, etc, com um movimento semelhante a uma bolha subindo
em um tubo de ensaio.

A cada passo, podemos limitar o procedimento posio do vetor que vai de


1 at a posio onde ocorreu a ltima troca no passo anterior.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 34


Algoritmo da Bolha (Bubblesort)
var
Lsup, Bolha, j : integer;
Aux : Clula

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;

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 35


Exemplo do algoritmo da Bolha

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

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 36


Comentrios sobre o mtodo da Bolha

Parece com o algoritmo de Seleo.


Este mtodo faz tantas trocas que o tornam o mais ineficiente de todos os
mtodos simples ou diretos.
Melhor caso:
Ocorre quando o arquivo est completamente ordenado, fazendo n 1
comparaes e nenhuma troca, em apenas um passo.
Pior caso:
Ocorre quando o arquivo est em ordem reversa, ou seja, quando o k-
simo passo faz n k comparaes e trocas, sendo necessrio n 1
passos.
Quanto mais ordenado estiver o arquivo melhor a atuao do mtodo.
No entanto, um arquivo completamente ordenado, com exceo da menor
Chave que est na ltima posio far o mesmo nmero de comparaes
do pior caso.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 37


Anlise do caso mdio

Comparaes:
n2 3n
C(n) =
2 4

Movimentos:
3n2 3n
M (n) =
4 4

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 38


Comentrios sobre o mtodo da Bolha

Mtodo lento:
S compara posies adjacentes.

Cada passo aproveita muito pouco do que foi aprendidosobre o arquivo no


passo anterior.

Comparaes redundantes em excesso, devido linearidade dos algoritmos,


e a uma seqncia fixa de comparaes.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 39


Comentrios sobre o mtodo da Bolha

Mtodo lento:
S compara posies adjacentes

Cada passo aproveita muito pouco do que foi aprendidosobre o arquivo no


passo anterior

Comparaes redundantes em excesso, devido linearidade dos algoritmos,


e a uma seqncia fixa de comparaes

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 40


Shellsort

Referncia: David L. Shell. A High-speed Sorting Procedure. Communica-


tions of the ACM, 2(7):3032, 1959.

O mtodo da insero troca itens adjacentes quando est procurando o ponto


de insero na seqncia destino
No primeiro passo se o menor item estiver mais direita no vetor so
necessrias n 1 comparaes para achar o seu ponto de insero.

Shellsort permite troca de itens distantes uns dos outros


Uma extenso do algoritmo de ordenao por insero

Shellsort contorna este problema permitindo trocas de registros que esto


distantes um do outro
Itens que esto separados h posies so rearranjados de tal forma que
todo h-simo item leva a uma seqncia ordenada.
Ordenao por insero atravs de incrementos decrescentes.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 41


Shellsort

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!

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 42


Shellsort: Seqncias para h

Referncia: Donald E. Knuth. The Art of Computer Programming, Vol. 3:


Sorting and Searching, 2nd ed. Reading, MA: Addison-Wesley, pp. 83-95,
1998.
hi = 3hi1 + 1 para i > 1
h1 = 1 para i = 1
A seqncia h = 1, 4, 13, 40, 121, 363, 1093, . . . , obtida empiricamente,
uma boa seqncia.

Robert Sedgewick props a seqncia


hi = 4i + 3 2i1 + 1 para i 1
h0 = 1
A seqncia h = 1, 8, 23, 77, 281, 1073, 4193, 16577, . . . , segundo
Sedgewick, mais rpida que a proposta por Knuth de 20 a 30%.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 43


Algoritmo Shellsort
procedure ShellSort (var A : Vetor);
label 999;
var i, j, h : integer;
T : Item;
begin
h := 1;
repeat h := 3*h + 1 until h >= n; {Seqncia proposta por Knuth}
repeat
h := h div 3;
for i := h+1 to n do
begin
T := A[i]; j := i;
while A[j-h].Chave > T.Chave do
begin
A[j] := A[j-h];
j := j - h;
if j <= h then goto 999;
end;
999:
A[j] := T;
end;
until h = 1;
end; {Shellsort}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 44


Shellsort: Ordem decrescente
1 2 3 4 5 6 Ci Mi
6 5 4 3 2 1
h=4 2 1 4 3 6 5 2 6
h=2 2 1 4 3 6 5 4 0
h=1 1 2 4 3 6 5 1 3 (i = 2)
h=1 1 2 4 3 6 5 1 0 (i = 3)
h=1 1 2 3 4 6 5 2 3 (i = 4)
h=1 1 2 3 4 6 5 1 0 (i = 5)
h=1 1 2 3 4 5 6 2 3 (i = 6)
13 15 (Total)

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 45


Comentrios sobre o Shellsort

A implementao do Shellsort no utiliza registros sentinelas


Seriam necessrios h registros sentinelas, uma para cada h-ordenao.

Porque o Shellsort mais eficiente?


A razo da eficincia do algoritmo ainda no conhecida.
Sabe-se que cada incremento no deve ser mltiplo do anterior.
Vrias seqncias para h foram experimentadas.
Uma que funciona bem (verificao emprica):
hi = 3hi1 + 1
h1 = 1
h = 1, 4, 13, 40, 121, . . .

Conjecturas referente ao nmero de comparaes para a seqncia de


Knuth:
Conjectura 1: C(n) = O(n(log n)2)
Conjectura 2: C(n) = O(n1.25)

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 46


Shellsort

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 47


Quicksort

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.

Quicksort o algoritmo de ordenao interna mais rpido que se conhece


para uma ampla variedade de situaes.

Provavelmente mais utilizado do que qualquer outro algoritmo.

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

Fazer uma escolha arbitrria de um item x do vetor chamado piv.

Rearranjar o vetor A[Esq..Dir] de acordo com a seguinte regra:


Elementos com chaves menores ou iguais a x vo para o lado esquerdo.
Elementos com chaves maiores ou iguais a x vo para o lado direito.
Note que uma vez rearranjados os elementos da partio, eles no mudam
mais de lado com relao ao elemento x.

Aplicar a cada uma das duas parties geradas os dois passos anteriores.

Parte delicada do mtodo o processo de partio.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 49


Quicksort
Quicksort(int A[],
int Esq,
int Dir)
{
int i;

if (Dir > Esq) /* Apontadores se cruzaram? */


{
i = Partition(Esq, Dir) /* Particiona de acordo com o piv */
Quicksort(A, Esq, i-1); /* Ordena sub-vetor da esquerda */
Quicksort(A, i+1, Dir); /* Ordena sub-vetor da direita */
}
}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 50


Quicksort

Os parmetros Esq e Dir definem os limites dos sub-vetores a serem ordena-


dos

Chamada inicial:
Quicksort(A, 1, n)

O procedimento Partition o ponto central do mtodo, que deve rearranjar


o vetor A de tal forma que o procedimento Quicksort possa ser chamado
recursivamente.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 51


Procedimento Partition

Rearranja o vetor A[Esq..Dir ] de tal forma que:


O piv (item x) vai para seu lugar definitivo A[i], 1 i n.
Os itens A[Esq], A[Esq+1], . . . , A[i 1] so menores ou iguais a A[i].
Os itens A[i + 1], A[i + 2], . . . , A[Dir ] so maiores ou iguais a A[i].

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 ].

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 52


Procedimento Partition
Escolher piv (Sedgewick):
Escolha o item A[Dir ] (x) do vetor que ir para sua posio final.
Observe que este item no est sendo retirado do vetor.

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.

Continue o processo at que os apontadores i e j se cruzem em algum ponto


do vetor.
Neste momento, deve-se trocar o elemento A[Dir ] com o mais esquerda
do sub-vetor da direita.
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 53
Exemplo da partio do vetor
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

Esq = 1 e Dir = 15.

Escolha do piv (item x):


Item x = A[15] = E.

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

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 54


Exemplo da partio do vetor
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 S A M P L E

i j Piv

A varredura a partir da posio 1 pra no item S (S > E) e a varredura a partir


da posio 15 pra no item A (A < E), sendo os dois itens trocados.
Como o vetor ainda no foi todo rearranjado (i e j se cruzarem) o processo
deve continuar.

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

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 55


Exemplo da partio do vetor
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 O E X S M P L E

i j Piv

A varredura a partir da posio 2 pra no item O (O > E) e a varredura a partir


da posio 11 pra no item E (x = E), sendo os dois itens trocados.
Como o vetor ainda no foi todo rearranjado (i e j se cruzarem) o processo
deve continuar.

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

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 56


Exemplo da partio do vetor
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 R T I N G O X S M P L E

j i Piv

A varredura a partir da posio 3 pra no item R (R > E) e a varredura a partir


da posio 9 pra no item E (x = E), sendo que os apontadores se cruzam.
Piv deve ser trocado com o R (item mais esquerda do sub-vetor da direita).

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

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 57


Quicksort: Procedimento Partio
Quicksort(int A[], int Esq, int Dir) {
int x, /* Piv */
i, j, /* Apontadores para o sub-vetor */
t; /* Varivel auxiliar para troca */

if (Dir > Esq) { /* Apontadores se cruzaram? */


x = A[Dir]; /* Define o piv */
i = Esq - 1; /* Inicializa apontador da esq */
j = Dir; /* Inicializa apontador da dir */
for (;;) { /* Faz a varredura no vetor */
while (a[++i] < x); /* Percorre a partir da esquerda */
while (a[--j] > x); /* Percorre a partir da direita */
if (i >= j) break; /* Apontadores se cruzaram? */

t = A[i]; A[i] = A[j]; A[j] = t; /* Faz a troca entre os elementos */


}

t = A[i]; A[i] = A[j]; A[j] = t; /* Coloca o piv na posio final */

Quicksort(A, Esq, i-1); /* Ordena sub-vetor da esquerda */


Quicksort(A, i+1, Dir); /* Ordena sub-vetor da direita */
}
}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 58


Quicksort: Seqncia de passos recursivos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A A E E T I N G O X S M P L R
A A E
A A
L I N G O P M R X T S
L I G M O P N
G I L
I L
N P O
O P
S T X
T X
A A E E G I L M N O P R S T X

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 59


Anlise do Quicksort
Consideraes iniciais
Seja C(n) a funo que conta o nmero de comparaes.

O pior caso ocorre quando, sistematicamente, o piv escolhido como sendo


um dos extremos de um arquivo j ordenado.

Isto faz com que o procedimento Partition seja chamado recursivamente n


vezes, eliminando apenas um item em cada chamada.
Neste caso, se uma partio tem p elementos, ento gerada uma outra
partio com p 1 elementos e o piv vai para a sua posio final.
Note que neste caso no gerada uma segunda partio, ou seja, temos
um caso degenerado.

O pior caso pode ser evitado empregando pequenas modificaes no algo-


ritmo:
Escolher trs elementos ao acaso e pegar o do meio (Mediana de 3).
Escolher k elementos ao acaso, ordenar os k elementos e obter o ( k+1
2 )-
simo elemento.
Claro, obter o elemento mdio custa, mas compensa!
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 60
Outra melhoria para o Quicksort?
Parties pequenas

Utilizar um mtodo simples de ordenao quando o nmero de elementos


numa partio for pequeno.

Existem algoritmos de ordenao simples, com custo O(n2) no pior caso,


que so mais rpidos que o Quicksort para valores pequenos de n.

Para parties entre 5 e 20 elementos usar um mtodo O(n2):


Knuth sugere 9.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 61


Outra melhoria para o Quicksort?
Trocar espao por tempo

Criar um vetor de apontadores para os registros a ordenar.

Fazemos as comparaes entre os elementos apontados, mas no move-


mos os registros movemos apenas os apontadores da mesma forma que o
Quicksort move registros.

Ao final os apontadores (lidos da esquerda para a direita) apontam para os


registros na ordem desejada.

Qual o ganho neste caso?


Fazemos apenas n trocas ao invs de O(n log n), o que faz enorme difer-
ena se os registros forem grandes.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 62


Anlise do Quicksort
Melhor caso

Esta situao ocorre quando cada partio divide o arquivo em duas partes
iguais.

C(n) = 2C(n/2) + n = n log n n + 1 = O(n log n)

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 63


Anlise do Quicksort
Caso mdio

De acordo com Sedgewick e Flajolet (1996, p. 17), o nmero de comparaes


aproximadamente:

C(n) 1, 386n log n 0, 846n = O(n log n).

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 64


Anlise do Quicksort
Pior caso

Em cada chamada o pior piv possvel selecionado!

Por exemplo, o maior elemento de cada sub-vetor sendo ordenado.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 65


Anlise do Quicksort
Pior caso

Seqncia de parties de um conjunto j ordenado!

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)

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 66


Quicksort e a tcnica diviso-e-conquista

A tcnica diviso-e-conquista consiste basicamente de trs passos:


1. Divide.
2. Conquista.
3. Combina.

No caso do Quicksort, o passo 2 executado antes do passo 1, ou seja,


poderia ser considerado um mtodo de conquista-e-diviso.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 67


Quicksort e a tcnica diviso-e-conquista

Passos do Quicksort considerando o vetor A[Esq..Dir ]:

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.

2. Divide A[Esq..Dir ] em dois sub-vetores (parties) A[Esq..i 1] e A[i +


1..Dir ].
O passo anterior novamente aplicado a cada partio.

3. Combina no faz nada j que o vetor A, ao final dos dois passos anteriores,
est ordenado.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 68


Quicksort: Comentrios finais

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 69


Algumas referncias sobre Quicksort

Knuth, D.E. The Art of Computer Programming, Vol. 3: Sorting and Searching,
2nd ed. Reading, MA: Addison-Wesley, pp. 113-122, 1998.

Sedgewick, R. Quicksort. Ph.D. thesis. Stanford Computer Science Report


STAN-CS-75-492. Stanford, CA: Stanford University, May 1975.

Sedgewick, R. The Analysis of Quicksort Programs. Acta Informatica 7:327


355, 1977.

Sedgewick, R. Implementing Quicksort Programs. Communications of the


ACM 21(10):847857, 1978.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 70


Heapsort

Mesmo princpio da ordenao por seleo.

Algoritmo (considere um conjunto de elementos armazenados num vetor):


1. Selecione o menor elemento do conjunto.
2. Troque-o com o elemento da primeira posio do vetor.
3. Repita os passos anteriores para os n 1 elementos restantes, depois
para os n 2 elementos restantes, e assim sucessivamente.

Custo (comparaes) para obter o menor elemento entre n elementos n1.

Este custo pode ser reduzido?


Sim, atravs da utilizao de uma estrutura de dados chamada fila de pri-
oridades.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 71


Fila de prioridades

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 72


Aplicaes de fila de prioridades

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).

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 73


Tipo abstrato de dados: Fila de prioridades

Comportamento: elemento com maior (menor) prioridade o primeiro a sair.

No mnimo duas operaes devem ser possveis:


Adicionar um elemento ao conjunto.
Extrair um elemento do conjunto que tenha a maior prioridade.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 74


TAD Fila de Prioridades
Principais operaes

1. Construir uma fila de prioridades a partir de um conjunto com n elementos.

2. Informar qual o maior elemento do conjunto.

3. Inserir um novo elemento.

4. Aumentar o valor da chave do elemento i para um novo valor que maior


que o valor atual da chave.

5. Retirar maior (menor) elemento.

6. Substituir o maior elemento por um novo elemento, a no ser que o novo


elemento seja maior.

7. Alterar prioridade de um elemento.

8. Remover um elemento qualquer.

9. Fundir duas filas de prioridades em uma nica lista.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 75


Observaes sobre o TAD fila de prioridades

A nica diferena entre a operao de substituir e as operaes de inserir e


retirar executadas em seqncia que a operao de inserir aumenta a fila
temporariamente de tamanho.

Operao Construir:
Equivalente ao uso repetido da operao de Inserir.

Operao Alterar
Equivalente a Remover seguido de Inserir.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 76


Representaes para filas de prioridades

Lista linear ordenada


Construir: O(n log n).
Inserir: O(n).
Retirar: O(1).
Ajuntar: O(n).
Lista linear no ordenada (seqencial)
Construir: O(n).
Inserir: O(1).
Retirar: O(n).
Ajuntar: O(1), no caso de apontadores, ou O(n), no caso de arranjos.
Heap
Construir: O(n)
Inserir, Retirar, Substituir, Alterar: O(log n)
Ajuntar: depende da implementao. Por exemplo, rvores binomiais
eficiente e preserva o custo logartmico das quatro operaes anteriores
(J. Vuillemin, 1978).

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 77


Questo importante

Como utilizar as operaes sobre fila de prioridades para obter um algoritmo


de ordenao?
Uso repetido da operao de Inserir.
Uso repetido da operao de Retirar.

Representaes para filas de prioridades e os algoritmos correspondentes:


1. Lista linear ordenada Insero.

2. Lista linear no ordenada (seqencial) Seleo.

3. Heap Heapsort.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 78


Heap

Heap:
Nome original lanado no contexto do Heapsort.

Posteriormente:
Garbage-collected storage em linguagens de programao, tais como
Lisp e Turbo Pascal/C/. . .

Referncia: J.W.J. Williams, Algorithm 232 Heapsort, Communications of the


ACM, 7(6):347348, June 1964.

Construo do heap in situ proposto por Floyd.


Referncia: Robert W. Floyd, Algorithm 245 Treesort 3, Communications of
the ACM, 7(12):701, December 1964.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 79


Heap

Seqncia de elementos com as chaves

A[1], A[2], . . . , A[n]


tal que
(
A[2i], e
A[i]
A[2i + 1]
para i = 1, 2, . . . , n
2

Ordem facilmente visualizada se a seqncia de chaves for desenhada em


uma rvore binria, onde as linhas que saem de uma chave levam a duas
chaves menores no nvel inferior:
Estrutura conhecida como rvore binria completa

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 80


rvore binria completa

1 
S Ns so numerados por nveis de 1 a n,

 Z



 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

chaves de seus filhos, se existirem.


A chave no n raiz a maior chave do
conjunto.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 81


rvore binria completa e Arranjo
Existe uma dualidade entre a representao usando vetor e a representao de
rvore.

1 
S 
 Z
 Z
 Z
 Z
 Z
 Z
2  3 
 Z
R O
1 2 3 4 5 6 7

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

Seja, n o nmero de ns e i o nmero de qualquer n. Logo,


Pai(i) = bi/2c para i 6= 1
Filho-esquerda(i) = 2i para 2i n
Filho-direita(i) = 2i + 1 para 2i + 1 n

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 82


rvore binria completa e Arranjo

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 83


Construo do heap: Invariante
Dado um vetor A[1], A[2], . . . , A[n], os elementos

A[ n2 +1], A[ n2 +2], . . . , A[n]


formam um heap, porque neste intervalo do vetor no existem dois ndices i e j
tais que j = 2i ou j = 2i + 1.

Para o arranjo abaixo, temos o seguinte heap:

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 84


TAD fila de prioridades usando heap
Maior elemento do conjunto
function Max (var A: Vetor): Item;
begin
Max := A[1];
end; {Max}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 85


TAD fila de prioridades usando heap
Refaz a condio de heap
procedure Refaz ( Esq, Dir: Indice;
var A : Vetor);
label 999;
var i: Indice;
j: integer;
x: Item;
begin
i := Esq;
j := 2 * i;
x := A[i];
while j <= Dir do
begin
if j < Dir
then if A[j].Chave < A[j + 1].Chave then j := j+1;
if A[j].Chave <= x.Chave then goto 999;
A[i] := A[j];
i := j;
j := 2 * i;
end;
999: A[i] := x;
end; {Refaz}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 86


TAD fila de prioridades usando heap
Constri o heap
{-- Usa o procedimento Refaz--}
procedure Constroi (var A: Vetor;
var n: Indice);
var Esq: Indice;
begin
Esq := n div 2 + 1;
while Esq > 1 do
begin
Esq := Esq - 1;
Refaz (Esq, n, A);
end;
end; {Constroi}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 87


TAD fila de prioridades usando heap
Retira o item com maior chave
function RetiraMax (var A: Vetor;
var n: Indice): Item;
begin
if n < 1
then writeln(Erro: heap vazio)
else begin
RetiraMax := A[1];
A[1] := A[n];
n := n - 1;
Refaz (1, n, A);
end;
end; {RetiraMax}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 88


TAD fila de prioridades usando heap
Aumenta o valor da chave do item i
procedure AumentaChave ( i : Indice;
ChaveNova: ChaveTipo;
var A : Vetor);
var k: integer;
x: Item;
begin
if ChaveNova < A[i].Chave
then writeln(Erro: ChaveNova menor que a chave atual)
else begin
A[i].Chave := ChaveNova;
while (i>1) and (A[i div 2].Chave < A[i].Chave) do
begin
x := A[i div 2];
A[i div 2] := A[i];
A[i] := x;
i := i div 2;
end;
end;
end; {AumentaChave}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 89


Operao sobre o TAD fila de prioridades
Aumenta o valor da chave do item na posio i
 
 S  S
 \  \
 \  \
 \  \

 \\ 
 \\

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

O tempo de execuo do procedimento AumentaChave em um item do heap


O(log n).
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 90
TAD fila de prioridades usando heap
Insere um novo item no heap
const Infinito = MaxInt;
.
.
.
procedure Insere (var x : Item;
var A : Vetor;
var n : Indice);
begin
n := n + 1;
A[n] := x;
A[n].Chave := -Infinito;
AumentaChave(n, x.Chave, A);
end; {Insere}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 91


Princpio do Heapsort
1. Construir o heap.
2. A partir do heap construdo, pega-se o elemento na posio 1 do vetor (raiz
do heap) e troca-se com o elemento que est na posio n do vetor.

3. A seguir, basta reconstruir o heap para os elementos


A[1], A[2], . . . , A[n 1].

4. Repita estas duas ltimas operaes com os n 1 elementos restantes,


depois com os n 2 elementos, at que reste apenas um elemento.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 92


Exemplo de construo do heap
1 2 3 4 5 6 7
Chaves iniciais O R D E N A S
Esq = 3 O R S E N A D
Esq = 2 O R S E N A D
Esq = 1 S R O E N A D

O heap estendido para a esquerda (Esq = 3), englobando o elemento A[3],


pai de A[6] e A[7].
Agora a condio do heap violada, elementos D e S so trocados.
Heap novamente estendido para a esquerda (Esq = 2) incluindo o elemento
R, passo que no viola a condio do heap.
Heap estendido para a esquerda (Esq = 1), a condio do heap violada,
elementos O e S so trocados, encerrando o processo.

Mtodo elegante que no necessita de nenhuma memria auxiliar.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 93


Exemplo de ordenao usando Heapsort

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

O caminho seguido pelo procedimento Refaz, para reconstituir a condio do


heap est em negrito.

Aps a troca dos elementos S e D, na segunda linha do exemplo, o elemento


D volta para a posio 5 aps passar pelas posies 1 e 2.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 94


Algoritmo Heapsort
procedure Heapsort (var A: Vetor);
var Esq, Dir: Indice;
x : Item;

{Entra aqui o procedimento Refaz}


{Entra aqui o procedimento Constroi}

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}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 95


Anlise do Heapsort

primeira vista no parece eficiente:


Chaves so movimentadas vrias vezes.
Procedimento Refaz gasta O(log n) operaes no pior caso.

Heapsort:
Tempo de execuo proporcional a O(n log n) no pior caso!

Heapsort no recomendado para arquivos com poucos registros porque:


O tempo necessrio para construir o heap alto.
O anel interno do algoritmo bastante complexo, se comparado com o anel
interno do Quicksort.

Quicksort , em mdia, cerca de duas vezes mais rpido que o Heapsort.

Entretanto, Heapsort melhor que o Shellsort para grandes arquivos.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 96


Observaes sobre o algoritmo do Heapsort

+ O comportamento do Heapsort sempre O(n log n), qualquer que seja a


entrada.

+ Aplicaes que no podem tolerar eventualmente um caso desfavorvel de-


vem usar o Heapsort.

O algoritmo no estvel, pois ele nem sempre deixa os registros com


chaves iguais na mesma posio relativa.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 97


Comparao entre os mtodos: Complexidade

Mtodo Complexidade
Insero O(n2)
Seleo O(n2)
Shellsorta O(n log n)
Quicksortb O(n log n)
Heapsort O(n log n)

a Apesar de no se conhecer analiticamente o comportamento do Shellsort,

ele considerado um mtodo eficiente.


b No melhor caso e caso mdio.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 98


Comparao entre os mtodos:
Tempo de execuo
Observao: O mtodo que levou menos tempo real para executar recebeu o valor 1 e os
outros receberam valores relativos a ele.
Mtodo 500 5 000 10 000 30 000
Insero 11,3 87 161
Registros na ordem Seleo 16,2 124 228
aleatria Shellsort 1,2 1,6 1,7 2
Quicksort 1 1 1 1
Heapsort 1,5 1,6 1,6 1,6
Mtodo 500 5 000 10 000 30 000
Insero 1 1 1 1
Registros na ordem Seleo 128 1524 3066
ascendente Shellsort 3,9 6,8 7,3 8,1
Quicksort 4,1 6,3 6,8 7,1
Heapsort 12,2 20,8 22,4 24,6
Mtodo 500 5 000 10 000 30 000
Insero 40,3 305 575
Registros na ordem Seleo 29,3 221 417
descendente Shellsort 1,5 1,5 1,6 1,6
Quicksort 1 1 1 1
Heapsort 2,5 2,7 2,7 2,9
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 99
Observaes sobre os mtodos

1. Shellsort, Quicksort e Heapsort tm a mesma ordem de grandeza.


2. O Quicksort o mais rpido para todos os tamanhos aleatrios experimen-
tados.
3. A relao Heapsort/Quicksort se mantm constante para todos os taman-
hos.
4. A relao Shellsort/Quicksort aumenta medida que o nmero de elemen-
tos aumenta.
5. Para arquivos pequenos (500 elementos), o Shellsort mais rpido que o
Heapsort.
6. Quando o tamanho da entrada cresce, o Heapsort mais rpido que o
Shellsort.
7. O Insero o mais rpido para qualquer tamanho se os elementos esto
ordenados.
8. O Insero o mais lento para qualquer tamanho se os elementos esto
em ordem descendente.
9. Entre os algoritmos de custo O(n2), o Insero melhor para todos os
tamanhos aleatrios experimentados.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 100


Comparao entre os mtodos
Influncia da ordem inicial do registros
Shellsort Quicksort Heapsort
5000 10000 30000 5000 10000 30000 5000 10000 30000
Asc 1 1 1 1 1 1 1,1 1,1 1,1
Des 1,5 1,6 1,5 1,1 1,1 1,1 1 1 1
Ale 2,9 3,1 3,7 1,9 2 2 1,1 1 1

1. O Shellsort bastante sensvel ordenao ascendente ou descendente


da entrada.
2. Em arquivos do mesmo tamanho, o Shellsort executa mais rpido para ar-
quivos ordenados.
3. O Quicksort sensvel ordenao ascendente ou descendente da en-
trada.
4. Em arquivos do mesmo tamanho, o Quicksort executa mais rpido para
arquivos ordenados.
5. O Quicksort o mais rpido para qualquer tamanho para arquivos na ordem
ascendente.
6. O Heapsort praticamente no sensvel ordenao da entrada.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 101


Comparao entre os mtodos: Insero

o mais interessante para arquivos com menos do que 20 elementos.

O mtodo estvel.

Possui comportamento melhor do que o mtodo da Bolha, que tambm


estvel.

Sua implementao to simples quanto a implementao dos mtodos da


Bolha e Seleo.

Para arquivos j ordenados, o mtodo O(n).

O custo linear para adicionar alguns elementos a um arquivo j ordenado.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 102


Comparao entre os mtodos: Seleo

vantajoso quanto ao nmero de movimentos de registros, que O(n).

Deve ser usado para arquivos com registros muito grandes, desde que o
tamanho do arquivo no exceda 1000 elementos.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 103


Comparao entre os mtodos: Shellsort

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.

Sua implementao simples e geralmente resulta em um programa pe-


queno.

No possui um pior caso ruim e quando encontra um arquivo parcialmente


ordenado trabalha menos.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 104


Comparao entre os mtodos: Quicksort
o algoritmo mais eficiente que existe para uma grande variedade de situ-
aes.

um mtodo bastante frgil no sentido de que qualquer erro de implemen-


tao pode ser difcil de ser detectado.

O algoritmo recursivo, o que demanda uma pequena quantidade de


memria adicional.

Seu desempenho da ordem de O(n2) operaes no pior caso.

O principal cuidado a ser tomado com relao escolha do piv.

A escolha do elemento do meio do arranjo melhora muito o desempenho


quando o arquivo est total ou parcialmente ordenado.

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

Geralmente se usa a mediana de uma amostra de trs elementos para evitar


o pior caso.

Esta soluo melhora o caso mdio ligeiramente.

Outra importante melhoria para o desempenho do Quicksort evitar


chamadas recursivas para pequenos subarquivos.

Para isto, basta chamar um mtodo de ordenao simples nos arquivos pe-
quenos.

A melhoria no desempenho significativa, podendo chegar a 20% para a


maioria das aplicaes (Sedgewick, 1988).

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 106


Comparao entre os mtodos: Heapsort

um mtodo de ordenao elegante e eficiente.

Apesar de ser cerca de duas vezes mais lento do que o Quicksort, no ne-
cessita de nenhuma memria adicional.

Executa sempre em tempo O(n log n).

Aplicaes que no podem tolerar eventuais variaes no tempo esperado de


execuo devem usar o Heapsort.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 107


Comparao entre os mtodos
Consideraes finais
Para registros muito grandes desejvel que o mtodo de ordenao realize
apenas n movimentos dos registros.
Com o uso de uma ordenao indireta possvel se conseguir isso.

Suponha que o arquivo A contenha os seguintes registros:

A[1], A[2], . . . , A[n].

Seja P um arranjo P [1], P [2], . . . , P [n] de apontadores.

Os registros somente so acessados para fins de comparaes e toda movi-


mentao realizada sobre os apontadores.

Ao final, P [1] contm o ndice do menor elemento de A, P [2] o ndice do


segundo menor e assim sucessivamente.

Essa estratgia pode ser utilizada para qualquer dos mtodos de ordenao
interna.
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 108
Ordenao parcial

Consiste em obter os k primeiros elementos de um arranjo ordenado com n


elementos.

Quando k = 1, o problema se reduz a encontrar o mnimo (ou o mximo) de


um conjunto de elementos.

Quando k = n camos no problema clssico de ordenao.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 109


Ordenao parcial: Aplicaes

Facilitar a busca de informao na Web com as mquinas de busca:


comum uma consulta na Web retornar centenas de milhares de docu-
mentos relacionados com a consulta.

O usurio est interessado apenas nos k documentos mais relevantes.

Em geral k menor do que 200 documentos.

Normalmente so consultados apenas os dez primeiros.

Assim, so necessrios algoritmos eficientes de ordenao parcial.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 110


Ordenao parcial: Algoritmos considerados

Seleo parcial.

Insero parcial.

Heapsort parcial.

Quicksort parcial.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 111


Seleo parcial

Um dos algoritmos mais simples.

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 112


Seleo parcial
procedure SelecaoParcial (var A : Vetor;
var n, k: Indice);
var i, j, Min: Indice;
x : Item;
begin
for i := 1 to k do
begin
Min := i;
for j := i + 1 to n do
if A[j].Chave < A[Min].Chave then Min := j;
x := A[Min];
A[Min] := A[i];
A[i] := x;
end;
end; {SelecaoParcial}

Anlise: Comparaes entre chaves e movimentaes de registros:


2
C(n) = kn k2 2
k

M (n) = 3k

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 113


Seleo parcial

muito simples de ser obtido a partir da implementao do algoritmo de


ordenao por seleo.

Possui um comportamento espetacular quanto ao nmero de movimentos de


registros:
Tempo de execuo linear no tamanho de k.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 114


Insero parcial

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.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 115


Insero parcial

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}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 116


Insero parcial
Algoritmo que preserva o restante do vetor
procedure InsercaoParcial2 (var A: Vetor; var n, k: Indice);
var i, j: Indice;
x : Item;
begin
for i := 2 to n do
begin
x := A[i];
if i > k
then begin
j := k;
if x.Chave < A[k].Chave then A[i] := A[k];
end
else j := i - 1;
A[0] := x; {Sentinela}
while x.Chave < A[j].Chave do
begin
if j < k then A[j + 1] := A[j];
j := j - 1;
end;
if j < k then A[j+1] := x;
end;
end; {InsercaoParcial2}
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 117
Insero parcial: Anlise

No anel mais interno, na i-sima iterao o valor de Ci :


Melhor caso : Ci(n) = 1
Pior caso : Ci(n) = i
Caso mdio : Ci(n) = 1i (1 + 2 + + i) = i+1
2

Assumindo que todas as permutaes de n so igualmente provveis, o


nmero de comparaes :
Melhor caso : C(n) = (1 + 1 + + 1) = n 1
Pior caso : C(n) = (2 + 3 + + k + (k + 1)(n k))
2
= kn + n k2 2 k 1
1 (3 + 4 + + k + 1 + (k + 1)(n k))
Caso mdio : C(n) = 2
= kn + n k2 + k 1
2 2 4 4

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 118


Insero parcial: Anlise

O nmero de movimentaes na i-sima iterao :

Mi(n) = Ci(n) 1 + 3 = Ci(n) + 2

Logo, o nmero de movimentos :


Melhor caso : M (n) = (3 + 3 + + 3) = 3(n 1)
Pior caso : M (n) = (4 + 5 + + k + 2 + (k + 1)(n k))
2
= kn + n 2 + 3k
k
2 3
Caso mdio : M (n) = 1
2 (5 + 6 + + k + 3 + (k + 1)(n k))
= kn + n k2 + 5k 2
2 2 4 4

O nmero mnimo de comparaes e movimentos ocorre quando os itens


esto originalmente em ordem.

O nmero mximo ocorre quando os itens esto originalmente na ordem re-


versa.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 119


Heapsort parcial

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].

Em seguida o heap refeito.

Novamente, o menor est em A[1], troque-o com A[n 1].

Repita as duas ltimas operaes at que o k-simo menor seja trocado com
A[n k].

Ao final, os k menores esto nas k ltimas posies do vetor A.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 120


Heapsort parcial
procedure HeapsortParcial (var A : Vetor;
var n,k: Indice);
{Coloca menor em A[n], segundo em A[n-1], ...,k-esimo em A[n-k]}
var Esq, Dir: Indice;
x : Item;
Aux : integer;
{Entram aqui os procedimentos Refaz e Constroi}
begin
Constroi(A, n); {Constroi o heap}
Aux := 0;
Esq := 1;
Dir := n;
while Aux < k do {Ordena o vetor}
begin
x := A[1];
A[1] := A[n - Aux];
A[n - Aux] := x;
Dir := Dir - 1;
Aux := Aux + 1;
Refaz (Esq, Dir, A);
end;
end; {HeapsortParcial}

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 121


Heapsort parcial: Anlise

O HeapsortParcial deve construir um heap a um custo O(n).

O procedimento Refaz tem custo O(log n).

O procedimento HeapsortParcial chama o procedimento Refaz k vezes.

Logo, o algoritmo apresenta a complexidade:


(
O(n) n
se k log
O(n + k log n) = n
n
O(k log n) se k > log n

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 122


Quicksort parcial

Assim como o Quicksort, o Quicksort parcial o algoritmo de ordenao par-


cial mais rpido em vrias situaes.

A alterao no algoritmo para que ele ordene apenas os k primeiros itens


dentre n itens muito simples.

Basta abandonar a partio direita toda vez que a partio esquerda


contiver k ou mais itens.

Assim, a nica alterao necessria no Quicksort evitar a chamada recur-


siva Ordena(i,Dir).

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 123


Quicksort parcial
Chaves iniciais: O R D E N A
1 A D R E N O
2 A D
3 E R N O
4 N R O
5 O R
A D E N O R

Considere k = 3 e D o piv para gerar as linhas 2 e 3.


A partio esquerda contm dois itens e a partio direita contm quatro
itens.
A partio esquerda contm menos do que k itens.
Logo, a partio direita no pode ser abandonada.
Considere E o piv na linha 3.
A partio esquerda contm trs itens e a partio direita tambm.
Assim, a partio direita pode ser abandonada.
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 124
Quicksort parcial
procedure QuickSortParcial (var A: Vetor;
var n, k: Indice);
{Entra aqui o procedimento Particao}
procedure Ordena (Esq, Dir, k: Indice);
var i, j: Indice;
begin
Particao (Esq, Dir, i, j);
if (j-Esq) >= (k-1)
then begin
if Esq < j then Ordena (Esq, j, k)
end
else begin
if Esq < j then Ordena (Esq, j, k);
if i < Dir then Ordena (i, Dir, k);
end;
end; {Ordena}
begin
Ordena (1, n, k);
end;

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 125


Quicksort parcial: Anlise

A anlise do Quicksort difcil.

O comportamento muito sensvel escolha do piv.

Podendo cair no melhor caso O(k log k).

Ou em algum valor entre o melhor caso e O(n log n).

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 126


Comparao entre os mtodos parciais
n, k Seleo Quicksort Insero Insero2 Heapsort
n : 101 k : 100 1 2,5 1 1,2 1,7
n : 101 k : 101 1,2 2,8 1 1,1 2,8
n : 102 k : 100 1 3 1,1 1,4 4,5
n : 102 k : 101 1,9 2,4 1 1,2 3
n : 102 k : 102 3 1,7 1 1,1 2,3
n : 103 k : 100 1 3,7 1,4 1,6 9,1
n : 103 k : 101 4,6 2,9 1 1,2 6,4
n : 103 k : 102 11,2 1,3 1 1,4 1,9
n : 103 k : 103 15,1 1 3,9 4,2 1,6
n : 105 k : 100 1 2,4 1,1 1,1 5,3
n : 105 k : 101 5,9 2,2 1 1 4,9
n : 105 k : 102 67 2,1 1 1,1 4,8
n : 105 k : 103 304 1 1,1 1,3 2,3
n : 105 k : 104 1445 1 33,1 43,3 1,7
n : 105 k : 105 1 1,9
n : 106 k : 100 1 3,9 1,2 1,3 8,1
n : 106 k : 101 6,6 2,7 1 1 7,3
n : 106 k : 102 83,1 3,2 1 1,1 6,6
n : 106 k : 103 690 2,2 1 1,1 5,7
n : 106 k : 104 1 5 6,4 1,9
n : 106 k : 105 1 1,7
n : 106 k : 106 1 1,8
n : 107 k : 100 1 3,4 1,1 1,1 7,4
n : 107 k : 101 8,6 2,6 1 1,1 6,7
n : 107 k : 102 82,1 2,6 1 1,1 6,8
n : 107 k : 103 3,1 1 1,1 6,6
n : 107 k : 104 1,1 1 1,2 2,6
n : 107 k : 105 1 2,2
n : 107 k : 106 1 1,2
n : 107 k : 107 1 1,7
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 127
Comparao entre os mtodos de ordenao
parcial

1. Para valores de k at 1.000, o mtodo da InseroParcial imbatvel.

2. O QuicksortParcial nunca ficar muito longe da InsercaoParcial.

3. Na medida em que o k cresce,o QuicksortParcial a melhor opo.

4. Para valores grandes de k, o mtodo da InseroParcial se torna ruim.

5. Um mtodo indicado para qualquer situao o QuicksortParcial.

6. O HeapsortParcial tem comportamento parecido com o do QuicksortParcial.

7. No entano, o HeapsortParcial mais lento.

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 128

You might also like