UFMG/ICEx/DCC
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
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
UFMG/ICEx/DCC
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
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
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
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
UFMG/ICEx/DCC
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
10
UFMG/ICEx/DCC
11
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
13
UFMG/ICEx/DCC
14
UFMG/ICEx/DCC
15
UFMG/ICEx/DCC
16
UFMG/ICEx/DCC
17
UFMG/ICEx/DCC
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
19
UFMG/ICEx/DCC
20
UFMG/ICEx/DCC
21
UFMG/ICEx/DCC
22
UFMG/ICEx/DCC
23
UFMG/ICEx/DCC
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
25
Caso mdio: Ci = 1 i
UFMG/ICEx/DCC
26
UFMG/ICEx/DCC
27
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
28
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
29
UFMG/ICEx/DCC
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
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
32
UFMG/ICEx/DCC
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
34
UFMG/ICEx/DCC
35
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
36
UFMG/ICEx/DCC
37
UFMG/ICEx/DCC
38
UFMG/ICEx/DCC
39
UFMG/ICEx/DCC
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
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
42
UFMG/ICEx/DCC
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
(i = 2) (i = 3) (i = 4) (i = 5) (i = 6) (Total)
UFMG/ICEx/DCC
45
UFMG/ICEx/DCC
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
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
UFMG/ICEx/DCC
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
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
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
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
UFMG/ICEx/DCC
54
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
55
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
56
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
57
*/ */
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? */
/* Coloca o piv na posio final */ /* Ordena sub-vetor da esquerda */ /* Ordena sub-vetor da direita */
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
59
UFMG/ICEx/DCC
61
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
62
UFMG/ICEx/DCC
63
UFMG/ICEx/DCC
64
UFMG/ICEx/DCC
65
UFMG/ICEx/DCC
66
UFMG/ICEx/DCC
67
UFMG/ICEx/DCC
68
UFMG/ICEx/DCC
69
UFMG/ICEx/DCC
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
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
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
UFMG/ICEx/DCC
74
UFMG/ICEx/DCC
76
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
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
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
80
2 R 4 E
f f f f
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
81
2 R
1 2 3 4 5 6 7
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
Filho-esquerda(i) = 2i Filho-direita(i)
UFMG/ICEx/DCC
= 2i + 1 para 2i + 1 n
82
UFMG/ICEx/DCC
83
formam um heap, porque neste intervalo do vetor no existem dois ndices i e j tais que j = 2i ou j = 2i + 1.
UFMG/ICEx/DCC
84
UFMG/ICEx/DCC
85
UFMG/ICEx/DCC
87
UFMG/ICEx/DCC
88
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
89
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
UFMG/ICEx/DCC
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
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
93
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
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
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
96
UFMG/ICEx/DCC
97
UFMG/ICEx/DCC
98
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
102
UFMG/ICEx/DCC
103
UFMG/ICEx/DCC
104
UFMG/ICEx/DCC
106
UFMG/ICEx/DCC
107
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
109
UFMG/ICEx/DCC
110
UFMG/ICEx/DCC
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
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}
UFMG/ICEx/DCC
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
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
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
116
kn + n k2 + k 1 2 2 4 4
UFMG/ICEx/DCC
118
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
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
121
UFMG/ICEx/DCC
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
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
125
UFMG/ICEx/DCC
126
UFMG/ICEx/DCC
128