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

Sumrio
Introduo: conceitos bsicos Ordenao Interna: Seleo Insero Bolha Shellsort Quicksort Heapsort Ordenao parcial: Seleo Insero Heapsort Quicksort Ordenao externa: Intercalao balanceada de vrios caminhos Implementao por meio de seleo por substituio Consideraes prticas Intercalao polifsica Quicksort externo

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

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 inui nos algoritmos

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

Denio e objetivos da ordenao


Ordenar corresponde ao processo de rearranjar um conjunto de objetos em uma ordem especca. 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

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 inuncia no processo de ordenar, a no ser pelo fato de que permanecem com a mesma chave. O tamanho dos outros componentes pode inuenciar 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

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 (a k 1 ) f (a k 2 ) . . . f (a k n ) Funo de ordenao denida sobre o campo chave.

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

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

Observaes
A escolha do tipo da chave como inteiro arbitrria. Qualquer tipo sobre o qual exista uma regra de ordenao bem denida 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 ordenada 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

Classicao 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

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

Classicao 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 ta. 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 Ecientes: 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 eciente
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 ecientes: 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 ordenadas. Suponha que ordenar o baralho implica em colocar as cartas de acordo com a ordem. A < 2 < 3 < . . . < 10 < J < Q < K e <o<n<

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 todos 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 car 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 espadas).

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: Classicadoras 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 Diculdades 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 Chaves iniciais i=1 i=2 i=3 i=4 i=5 44 12 12 12 12 12 2 12 44 18 18 18 18 3 55 55 55 42 42 42 4 42 42 42 55 44 44 5 94 94 94 94 94 55 6 18 18 44 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, . . . , cj 1, quando estamos percorrendo as chaves c1 , c 2 , . . . , c n . Anlise: 2 n 2 ). C (n) = 2 n = O ( n 2 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 continua 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 Chaves iniciais i=2 i=3 i=4 i=5 i=6 44 12 12 12 12 12 2 12 44 44 42 42 18 3 55 55 55 44 44 42 4 42 42 42 55 55 44 5 94 94 94 94 94 55 6 18 18 18 18 18 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 nal da seqncia destino atingido esquerda. A melhor soluo para a situao de um anel com duas condies de terminao 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 denido 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
1 ( i(i+1) ) = i+1 i j = j =1 i 2 2

Caso mdio: Ci = 1 i

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

26

Anlise de Insero: Comparaes


Consideraes: C (n) = n i=2 Ci. Vamos assumir que para o caso mdio todas as permutaes de n so igualmente provveis. Cada caso dado por: Melhor caso: Pior caso: Caso mdio:
n i=2 1 = n 1 n i=2 i = n(n+1) n2 + n 1 n 1 = i 1 = i=1 2 2 2

i+1 1 ( n(n+1) 1 + n 1) = n2 + 3n 1 i = 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) Temos que M (n) = Melhor caso: Pior caso:
n i=2 Mi, onde cada caso dado por: n i=2 3 = 3(n 1) = 3n 3 n i=2 i + n i=2 2 =

n (1 + 2) = i=2 n (i + 2) = i=2

2 n(n+1) n(n+1) n 5n 3 1 + 2( n 1) = + 2 n 3 = + 2 2 2 2

Caso mdio:

i+1 i ( i=2 2 + 2) =

i+1 n i=2 2 +

n2 + 11n 1 n 2 = i=2 4 4

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

28

Insero: Pior caso


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

n2 n 36 6 C (n) = + 1= + 1 = 18 + 3 1 = 20 2 2 2 2 5n 36 30 n2 + 3= + 3 = 18 + 15 3 = 30 M (n) = 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 reversa, 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 ordenados.

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 movimentaes 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 sucientemente 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 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 Lsup Passos

14 4 15 0 2 10 3 12 6 8 13 11 7 1 5 9

15 14 4 13 0 2 10 3 12 6 8 11 9 7 1 5 15 1

15 14 13 4 12 0 2 10 3 11 6 8 9 7 5 1 13 2

15 14 13 12 4 11 0 2 10 3 9 6 8 7 5 1 12 3

15 14 13 12 11 4 10 0 2 9 3 8 6 7 5 1 11 4

15 14 13 12 11 10 4 9 0 2 8 3 7 6 5 1 10 5

15 14 13 12 11 10 9 4 8 0 2 7 3 6 5 1 9 6

15 14 13 12 11 10 9 8 4 7 0 2 6 3 5 1 8 7

15 14 13 12 11 10 9 8 7 4 6 0 2 5 3 1 7 8

15 14 13 12 11 10 9 8 7 6 4 5 0 2 3 1 6 9

15 14 13 12 11 10 9 8 7 6 5 4 3 0 2 1 5 10

15 14 13 12 11 10 9 8 7 6 5 4 3 2 0 1 2 11

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 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 ineciente 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 ksimo 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 xa 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 xa de comparaes

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

40

Shellsort
Referncia: David L. Shell. A High-speed Sorting Procedure. Communications 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 44 12 12 12 2 94 18 18 18 3 55 55 44 42 4 42 42 42 44 5 12 44 55 55 6 18 94 94 94

h=4 h=2 h=1

(15, 26) (1:3, 2:4, 35, . . . ) (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 6 2 2 1 1 1 1 1 2 5 1 1 2 2 2 2 2 3 4 4 4 4 4 3 3 3 4 3 3 3 3 3 4 4 4 5 2 6 6 6 6 6 6 5 6 1 5 5 5 5 5 5 6 Ci 2 4 1 1 2 1 2 13 Mi 6 0 3 0 3 0 3 15

h=4 h=2 h=1 h=1 h=1 h=1 h=1

(i = 2) (i = 3) (i = 4) (i = 5) (i = 6) (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 eciente? A razo da ecincia 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 (vericao 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 pequena. 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 Visiting 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) { i = Partition(Esq , Dir) Quicksort(A, Esq , i-1); Quicksort(A, i+1, Dir); } } /* Apontadores se cruzaram? */ /* Particiona de acordo com o piv */ /* Ordena sub-vetor da esquerda */ /* Ordena sub-vetor da direita */

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

50

Quicksort
Os parmetros Esq e Dir denem os limites dos sub-vetores a serem ordenados 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 denitivo 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 nal da partio no foi feita uma ordenao nos itens que caram 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 nal. 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 nal, 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 A 2 S 3 O 4 R 5 T 6 I 7 N 8 G 9 10 11 12 13 14 15 E X A M P L E

Esq = 1 e Dir = 15. Escolha do piv (item x): Item x = A[15] = E. 1 A i 2 S 3 O 4 R 5 T 6 I 7 N 8 G 9 10 11 12 13 14 15 E X A M P L E j


Piv

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

54

Exemplo da partio do vetor


1 A A 2 S S i 3 O 4 R 5 T 6 I 7 N 8 G 9 10 11 12 13 14 15 E X A M P L E A M P L E 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 A A 2 S A i 3 O 4 R 5 T 6 I 7 N 8 G 9 10 11 12 13 14 15 E X A M P L E S M P L E j Piv

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

55

Exemplo da partio do vetor


1 A A 2 S A 3 O O i 4 R 5 T 6 I 7 N 8 G 9 10 11 12 13 14 15 E X A M P L E E X S M P L E 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 A A 2 S A 3 O E i 4 R 5 T 6 I 7 N 8 G 9 10 11 12 13 14 15 E X A M P L E O X S M P L E j Piv

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

56

Exemplo da partio do vetor


1 A A 2 S A 3 O E j 4 R R i 5 T T 6 I I 7 N N 8 G G 9 10 11 12 13 14 15 E X A M P L E O X S M P L E
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 A A 2 S A 3 O E 4 R E 5 T T 6 I I 7 N N 8 G G 9 10 11 12 13 14 15 E X A M P L E 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, i, j, t; if (Dir > Esq) { x = A[Dir]; i = Esq - 1; j = Dir; for (;;) { while (a[++i] < x); while (a[--j] > x); if (i >= j) break; t = A[i]; A[i] = A[j]; A[j] = t; } t = A[i]; A[i] = A[j]; A[j] = t; Quicksort(A, Esq , i-1); Quicksort(A, i+1, Dir); } }
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 58

/* Piv */ /* Apontadores para o sub-vetor /* Varivel auxiliar para troca /* /* /* /* /* /* /* /*

*/ */

Apontadores se cruzaram? */ Define o piv */ Inicializa apontador da esq */ Inicializa apontador da dir */ Faz a varredura no vetor */ Percorre a partir da esquerda */ Percorre a partir da direita */ Apontadores se cruzaram? */

/* Faz a troca entre os elementos */

/* Coloca o piv na posio final */ /* Ordena sub-vetor da esquerda */ /* Ordena sub-vetor da direita */

Quicksort: Seqncia de passos recursivos


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

L L G

I I I I

N G L L

G M

O O

P P

M N

P O

O P S T T T X X 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 nal. Note que neste caso no gerada uma segunda partio, ou seja, temos um caso degenerado. O pior caso pode ser evitado empregando pequenas modicaes no algoritmo: 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 movemos os registros movemos apenas os apontadores da mesma forma que o Quicksort move registros. Ao nal 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 diferena 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 n(n + 1) T (n) = i+n+2= 1+n+2 2 i=2 3n n2 + +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 nal 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 nal dos dois passos anteriores, est ordenado.

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

68

Quicksort: Comentrios nais


Vantagens: extremamente eciente 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 n 1. Este custo pode ser reduzido? Sim, atravs da utilizao de uma estrutura de dados chamada la de prioridades.

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 la 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 la 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 elemento 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 temporal).
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 la 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 las de prioridades em uma nica lista.
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 75

Observaes sobre o TAD la 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 la 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 las 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 eciente 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 la de prioridades para obter um algoritmo de ordenao? Uso repetido da operao de Inserir. Uso repetido da operao de Retirar. Representaes para las 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[i] 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 A[2i], A[2i + 1]
e

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

80

rvore binria completa


1  S
& & & & 

2  R 4  E
f f f f      

& &  & t t t t  t

3 O 6  A
f f f f f f f       t t t t  t



Ns so numerados por nveis de 1 a n, da esquerda para a direita, onde o n k/2 pai do n k, para 1 < k n. As chaves na rvore satisfazem a condio do heap: Chave de cada n maior que as chaves de seus lhos, se existirem. A chave no n raiz a maior chave do conjunto.

5  N
f

7  D
f f f f

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
& & & &  

2  R
1 2 3 4 5 6 7

& &  & t t t t  t

3  O
t t t t  t

4  E
f f f f

     

5  N
f f f f

6  A
f f f f

     

7  D
f f f f

Seja, n o nmero de ns e i o nmero de qualquer n. Logo, Pai(i) = i/2 para i = 1 para 2i n

Filho-esquerda(i) = 2i Filho-direita(i)
UFMG/ICEx/DCC

= 2i + 1 para 2i + 1 n
82

Algoritmos e Estruturas de Dados II

rvore binria completa e Arranjo


Utilizao de arranjo: Representao compacta. Permite caminhar pelos ns da rvore facilmente fazendo apenas manipulao 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
n A[ n 2 +1], A[ 2 +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 la 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 la 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 la 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 la 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 la 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 la de prioridades Aumenta o valor da chave do item na posio i


  ( ( ( (   (  f f f f      ( ( ( (   (  f f f f   

i  A  D

 f f f f  

i  U  D

 f f f f  

   t  t  t  t   t    f f f f f f f f     

i  U
        f f f f f f f f     

 t t t t  t

i U

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 la 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


Chaves iniciais Esq = 3 Esq = 2 Esq = 1 1 O O O S 2 R R R R 3 D S S O 4 E E E E 5 N N N N 6 A A A A 7 S D D 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 S R O N E D D 2 R N N E D A A 3 O O A A A E E 4 E E E D N N N 5 N D D O O O O 6 A A R R R R R 7 D S S S S S 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) Esq := 1; Dir := n; while Dir > 1 do begin x := A[1]; A[1] := A[Dir]; A[Dir] := x; Dir := Dir - 1; Refaz(Esq , Dir , A); end; end; {Heapsort}

{Constri o heap}

{Ordena o vetor}

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

95

Anlise do Heapsort
primeira vista no parece eciente: 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 devem 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 Insero Seleo Shellsorta Quicksortb Heapsort Complexidade O(n2) O(n2) O(n log n) O(n log n) O(n log n)

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

ele considerado um mtodo eciente. 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 Insero Seleo Shellsort Quicksort Heapsort Mtodo Insero Seleo Shellsort Quicksort Heapsort Mtodo Insero Seleo Shellsort Quicksort Heapsort 500 11,3 16,2 1,2 1 1,5 500 1 128 3,9 4,1 12,2 500 40,3 29,3 1,5 1 2,5 5 000 87 124 1,6 1 1,6 5 000 1 1524 6,8 6,3 20,8 5 000 305 221 1,5 1 2,7 10 000 161 228 1,7 1 1,6 10 000 1 3066 7,3 6,8 22,4 10 000 575 417 1,6 1 2,7 30 000 2 1 1,6 30 000 1 8,1 7,1 24,6 30 000 1,6 1 2,9
99

Registros na ordem aleatria

Registros na ordem ascendente

Registros na ordem descendente

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

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 experimentados. 3. A relao Heapsort/Quicksort se mantm constante para todos os tamanhos. 4. A relao Shellsort/Quicksort aumenta medida que o nmero de elementos 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 Inuncia da ordem inicial do registros


Asc Des Ale Shellsort 5000 10000 30000 1 1 1 1,5 1,6 1,5 2,9 3,1 3,7 Quicksort 5000 10000 30000 1 1 1 1,1 1,1 1,1 1,9 2 2 Heapsort 5000 10000 30000 1,1 1,1 1,1 1 1 1 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 arquivos ordenados. 3. O Quicksort sensvel ordenao ascendente ou descendente da entrada. 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 eciente 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 pequeno. 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 eciente que existe para uma grande variedade de situaes. um mtodo bastante frgil no sentido de que qualquer erro de implementao 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 elementos 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 pequenos. A melhoria no desempenho signicativa, 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 eciente. Apesar de ser cerca de duas vezes mais lento do que o Quicksort, no necessita 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 nais


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 ns de comparaes e toda movimentao realizada sobre os apontadores. Ao nal, 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 documentos 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 ecientes 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:


k C (n) = kn k 2 2 M (n) = 3k
2

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 modicao simples: Tendo sido ordenados os primeiros k itens, o item da k-sima posio funciona 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
procedure InsercaoParcial (var A : Vetor; var n, k: Indice); {Nao o restante do vetor} var i, j: Indice; x : Item; begin for i := 2 to n do begin 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} Observaes: 1. A modicao realizada verica o momento em que i se torna maior do que k e ento passa a considerar o valor de j igual a k a partir deste ponto. 2. O algoritmo no preserva o restante do vetor.

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 i+1 Caso mdio : Ci(n) = 1 (1 + 2 + + i ) = i 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))
k 1 = kn + n k 2 2 1 Caso mdio : C (n) = 2 (3 + 4 + + k + 1 + (k + 1)(n k))
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)) Caso mdio :
2 k k 3 = kn + n 2 + 3 2 1 M (n) = 2 (5 + 6 + + k + 3 + (k + 1)(n k)) n k2 + 5k 2 = kn + 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 reversa.
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 conjunto. 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 nal, 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 + k log n) =
n O(n) se k log 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 parcial 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 recursiva Ordena(i,Dir).

UFMG/ICEx/DCC

Algoritmos e Estruturas de Dados II

123

Quicksort parcial
Chaves iniciais: 1 2 3 4 5 O A A R D D D R E E E R N N N N N R O O A O O O R 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 n : 101 k : 100 n : 101 k : 101 n : 102 k : 100 n : 102 k : 101 n : 102 k : 102 n : 103 k : 100 n : 103 k : 101 n : 103 k : 102 n : 103 k : 103 n : 105 k : 100 n : 105 k : 101 n : 105 k : 102 n : 105 k : 103 n : 105 k : 104 n : 105 k : 105 n : 106 k : 100 n : 106 k : 101 n : 106 k : 102 n : 106 k : 103 n : 106 k : 104 n : 106 k : 105 n : 106 k : 106 n : 107 k : 100 n : 107 k : 101 n : 107 k : 102 n : 107 k : 103 n : 107 k : 104 n : 107 k : 105 n : 107 k : 106 n : 107 k : 107
UFMG/ICEx/DCC Seleo 1 1,2 1 1,9 3 1 4,6 11,2 15,1 1 5,9 67 304 1445 1 6,6 83,1 690 1 8,6 82,1 Quicksort 2,5 2,8 3 2,4 1,7 3,7 2,9 1,3 1 2,4 2,2 2,1 1 1 1 3,9 2,7 3,2 2,2 1 1 1 3,4 2,6 2,6 3,1 1,1 1 1 1 Insero 1 1 1,1 1 1 1,4 1 1 3,9 1,1 1 1 1,1 33,1 1,2 1 1 1 5 1,1 1 1 1 1 Insero2 1,2 1,1 1,4 1,2 1,1 1,6 1,2 1,4 4,2 1,1 1 1,1 1,3 43,3 1,3 1 1,1 1,1 6,4 1,1 1,1 1,1 1,1 1,2 Heapsort 1,7 2,8 4,5 3 2,3 9,1 6,4 1,9 1,6 5,3 4,9 4,8 2,3 1,7 1,9 8,1 7,3 6,6 5,7 1,9 1,7 1,8 7,4 6,7 6,8 6,6 2,6 2,2 1,2 1,7 127

Algoritmos e Estruturas de Dados II

Comparao entre os mtodos de ordenao parcial


1. Para valores de k at 1.000, o mtodo da InseroParcial imbatvel. 2. O QuicksortParcial nunca car 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