Академический Документы
Профессиональный Документы
Культура Документы
Algoritmo de Ordenação
Prof. Marco Aurélio Stefanes
marco em facom.ufms.br
www.facom.ufms.br/ ˜ marco
Aula 06 - Heapsort – p. 1
Ordenação
A[1 . . . n] é crescente se A[1] ≤ · · · ≤ A[n].
Entra:
1 n
33 55 33 44 33 22 11 99 22 55 77
Aula 06 - Heapsort – p. 2
Ordenação
A[1 . . . n] é crescente se A[1] ≤ · · · ≤ A[n].
Entra:
1 n
33 55 33 44 33 22 11 99 22 55 77
Sai:
1 n
11 22 22 33 33 33 44 55 55 77 99
Aula 06 - Heapsort – p. 2
Representar Árvores em Vetores
0
3
nível
7
3
9 10 11 12
6
8
12
7
1
1
6
11
5
5
4
3
Aula 06 - Heapsort – p. 3
10
Pais e filhos
A[1 . . . m] é um vetor representando uma árvore.
Diremos que para qualquer índice ou nó i,
⌊i/2⌋ é o pai de i;
2i é o filho esquerdo de i;
2i + 1 é o filho direito.
Aula 06 - Heapsort – p. 4
Níveis
Cada nível p, exceto talvez o último, tem exatamente 2p nós
e esses são
2p , 2p + 1, 2p + 2, . . . , 2p+1 − 1.
Aula 06 - Heapsort – p. 5
Níveis
Cada nível p, exceto talvez o último, tem exatamente 2p nós
e esses são
2p , 2p + 1, 2p + 2, . . . , 2p+1 − 1.
Aula 06 - Heapsort – p. 5
Níveis
Cada nível p, exceto talvez o último, tem exatamente 2p nós
e esses são
2p , 2p + 1, 2p + 2, . . . , 2p+1 − 1.
2p ≤ i < 2p+1 ⇒
lg 2p ≤ lg i < lg 2p+1 ⇒
p ≤ lg i < p + 1
Aula 06 - Heapsort – p. 5
Níveis
Cada nível p, exceto talvez o último, tem exatamente 2p nós
e esses são
2p , 2p + 1, 2p + 2, . . . , 2p+1 − 1.
2p ≤ i < 2p+1 ⇒
lg 2p ≤ lg i < lg 2p+1 ⇒
p ≤ lg i < p + 1
Aula 06 - Heapsort – p. 5
Níveis
Cada nível p, exceto talvez o último, tem exatamente 2p nós
e esses são
2p , 2p + 1, 2p + 2, . . . , 2p+1 − 1.
2p ≤ i < 2p+1 ⇒
lg 2p ≤ lg i < lg 2p+1 ⇒
p ≤ lg i < p + 1
Aula 06 - Heapsort – p. 5
Altura
A altura de um nó i é o maior comprimento de um caminho
de i a uma folha.
Em outras palavras, a altura de um nó i é o maior
comprimento de uma seqüência da forma
Aula 06 - Heapsort – p. 6
Altura
A altura de um nó i é o maior comprimento de um caminho
de i a uma folha.
Em outras palavras, a altura de um nó i é o maior
comprimento de uma seqüência da forma
A altura de um nó i é ????.
Aula 06 - Heapsort – p. 6
Exercício
A altura de um nó i é o comprimento da seqüência
{2 i, 22 i, 23 i, . . . , 2h i}
2h i ≤ m < 2h+1 i ⇒
2h ≤ m/i < lg 2h+1 ⇒
h ≤ lg(m/i) < h + 1
Portanto, a altura de i é ⌊lg(m/i)⌋.
Aula 06 - Heapsort – p. 7
Exercício
Mostre que A[1 . . . m] tem no máximo ⌈m/2h+1 ⌉ nós com
altura h.
Exemplo: Nh = número de nós à altura h
16 8 8 8 4 4 4
17 8 9 9 4 4 5
18 9 9 9 4 5 5
19 9 10 10 4 5 5
20 10 10 10 5 5 5
21 10 11 11 5 5 6
22 11 11 11 5 6 6
23 11 12 12 5 6 6
24 12 12 12 6 6 6
Aula 06 - Heapsort – p. 8
Resumindo
Considere uma árvore representada em um vetor A[1 . . . m].
filho esquerdo de i: 2i
filho direito de i: 2i + 1
pai de i: ⌊i/2⌋
nível da raiz: 0
nível de i: ⌊lg i⌋
A[⌊i/2⌋] ≥ A[i]
para todo i = 2, 3, . . . , m.
A[⌊i/2⌋] ≥ A[i]
Aula 06 - Heapsort – p. 10
Heap
1 nível
Interferência!
51 0
2 3
46 17 1
4 5 6 7
34 41 15 14 2
8 9 10 11 12
23 30 21 10 12 3
1 2 3 4 5 6 7 8 9 10 11 12
51 46 17 34 41 15 14 23 30 21 10 12
Aula 06 - Heapsort – p. 11
Manipulação de heap
1 nível
13 0
2 3
46 17 1
4 5 6 7
34 41 15 14 2
8 9 10 11 12
23 30 21 10 12 3
1 2 3 4 5 6 7 8 9 10 11 12
13 46 17 34 41 15 14 23 30 21 10 12
Aula 06 - Heapsort – p. 12
Manipulação de heap
1 nível
46 0
2 3
13 17 1
4 5 6 7
34 41 15 14 2
8 9 10 11 12
23 30 21 10 12 3
1 2 3 4 5 6 7 8 9 10 11 12
46 13 17 34 41 15 14 23 30 21 10 12
Aula 06 - Heapsort – p. 13
Manipulação de heap
1 nível
46 0
2 3
41 17 1
4 5 6 7
34 13 15 14 2
8 9 10 11 12
23 30 21 10 12 3
1 2 3 4 5 6 7 8 9 10 11 12
46 41 17 34 13 15 14 23 30 21 10 12
Aula 06 - Heapsort – p. 14
Manipulação de heap
1 nível
46 0
2 3
41 17 1
4 5 6 7
34 21 15 14 2
8 9 10 11 12
23 30 13 10 12 3
1 2 3 4 5 6 7 8 9 10 11 12
46 41 17 34 21 15 14 23 30 13 10 12
Aula 06 - Heapsort – p. 15
Manipulação de heap
1 nível
46 0
2 3
41 17 1
4 5 6 7
34 21 15 14 2
8 9 10 11 12
23 30 13 10 12 3
1 2 3 4 5 6 7 8 9 10 11 12
46 41 17 34 21 15 14 23 30 13 10 12
Aula 06 - Heapsort – p. 16
Manipulação de heap
Recebe A[1 . . . m] e i ≥ 1 tais que subárvores com raiz 2i e
2i + 1 são heaps e rearranja A de modo que subárvore com
raiz i seja heap.
Heapify (A, m, i)
1: e = 2i
2: d = 2i + 1
3: se e ≤ m e A[e] > A[i] então
4: maior = e
5: senão
6: maior = i
7: se d ≤ m e A[d] > A[maior] então
8: maior = d
9: se maior 6= i então
10: A[i] ↔ A[maior]
11: Heapify(A, m, maior)
Aula 06 - Heapsort – p. 17
Correção do Heapify
Caso 1 - A[i] ≥ max(A[2i], A[2i + 1]).
A subárvore i já possui propriedade heap
Caso 2 - A[i] < max(A[2i], A[2i + 1])
Suponha SPG A[2i] ≥ A[2i + 1].
Trocando os valores de A[i] com A[2i], o nó i satisfaz a
propriedade A[i] ≤ A[2i] e A[i] ≤ A[2i + 1]. A subárvore
com raiz 2i + 1 não foi alterada e, por hipótese, satisfaz
a propriedade heap. Porém o procedimento precisa ser
chamado para o nó 2i
Aula 06 - Heapsort – p. 18
Consumo de tempo
h := altura de i = ⌊lg mi ⌋
T (h) := consumo de tempo no pior caso
Aula 06 - Heapsort – p. 19
Consumo de tempo
h := altura de i = ⌊lg mi ⌋
T (h) := consumo de tempo no pior caso
Recorrência associada:
T (h) ≤ T (h − 1) + Θ(1),
Aula 06 - Heapsort – p. 20
Consumo de tempo
h := altura de i = ⌊lg mi ⌋
T (h) := consumo de tempo no pior caso
Recorrência associada:
T (h) ≤ T (h − 1) + Θ(1),
Aula 06 - Heapsort – p. 20
Consumo de tempo
h := altura de i = ⌊lg mi ⌋
T (h) := consumo de tempo no pior caso
Recorrência associada:
T (h) ≤ T (h − 1) + Θ(1),
Aula 06 - Heapsort – p. 20
Construção de um Heap
1 nível
14 0
2 3
13 34 1
4 5 6 7
17 15 10 46 2
8 9 10 11 12
23 12 41 30 21 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 34 17 15 10 46 23 12 41 30 21
Aula 06 - Heapsort – p. 21
Construção de um Heap
1 nível
14 0
2 3
13 34 1
4 5 6 7
17 15 10 46 2
8 9 10 11 12
23 12 41 30 21 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 34 17 15 10 46 23 12 41 30 21
Aula 06 - Heapsort – p. 22
Construção de um Heap
1 nível
14 0
2 3
13 34 1
4 5 6 7
17 15 21 46 2
8 9 10 11 12
23 12 41 30 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 34 17 15 21 46 23 12 41 30 10
Aula 06 - Heapsort – p. 23
Construção de um Heap
1 nível
14 0
2 3
13 34 1
4 5 6 7
17 15 21 46 2
8 9 10 11 12
23 12 41 30 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 34 17 15 21 46 23 12 41 30 10
Aula 06 - Heapsort – p. 24
Construção de um Heap
1 nível
14 0
2 3
13 34 1
4 5 6 7
17 41 21 46 2
8 9 10 11 12
23 12 15 30 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 34 17 41 21 46 23 12 15 30 10
Aula 06 - Heapsort – p. 25
Construção de um Heap
1 nível
14 0
2 3
13 34 1
4 5 6 7
17 41 21 46 2
8 9 10 11 12
23 12 15 30 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 34 17 41 21 46 23 12 15 30 10
Aula 06 - Heapsort – p. 26
Construção de um Heap
1 nível
14 0
2 3
13 34 1
4 5 6 7
23 41 21 46 2
8 9 10 11 12
17 12 15 30 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 34 23 41 21 46 17 12 15 30 10
Aula 06 - Heapsort – p. 27
Construção de um Heap
1 nível
14 0
2 3
13 34 1
4 5 6 7
23 41 21 46 2
8 9 10 11 12
17 12 15 30 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 34 23 41 21 46 17 12 15 30 10
Aula 06 - Heapsort – p. 28
Construção de um Heap
1 nível
14 0
2 3
13 46 1
4 5 6 7
23 41 21 34 2
8 9 10 11 12
17 12 15 30 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 46 23 41 21 34 17 12 15 30 10
Aula 06 - Heapsort – p. 29
Construção de um Heap
1 nível
14 0
2 3
13 46 1
4 5 6 7
23 41 21 34 2
8 9 10 11 12
17 12 15 30 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 13 46 23 41 21 34 17 12 15 30 10
Aula 06 - Heapsort – p. 30
Construção de um Heap
1 nível
14 0
2 3
41 46 1
4 5 6 7
23 13 21 34 2
8 9 10 11 12
17 12 15 30 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 41 46 23 13 21 34 17 12 15 30 10
Aula 06 - Heapsort – p. 31
Construção de um Heap
1 nível
14 0
2 3
41 46 1
4 5 6 7
23 30 21 34 2
8 9 10 11 12
17 12 15 13 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 41 46 23 30 21 34 17 12 15 13 10
Aula 06 - Heapsort – p. 32
Construção de um Heap
1 nível
14 0
2 3
41 46 1
4 5 6 7
23 30 21 34 2
8 9 10 11 12
17 12 15 13 10 3
1 2 3 4 5 6 7 8 9 10 11 12
14 41 46 23 30 21 34 17 12 15 13 10
Aula 06 - Heapsort – p. 33
Construção de um Heap
1 nível
46 0
2 3
41 14 1
4 5 6 7
23 30 21 34 2
8 9 10 11 12
17 12 15 13 10 3
1 2 3 4 5 6 7 8 9 10 11 12
46 41 14 23 30 21 34 17 12 15 13 10
Aula 06 - Heapsort – p. 34
Construção de um Heap
1 nível
46 0
2 3
41 34 1
4 5 6 7
23 30 21 14 2
8 9 10 11 12
17 12 15 13 10 3
1 2 3 4 5 6 7 8 9 10 11 12
46 41 34 23 30 21 14 17 12 15 13 10
Aula 06 - Heapsort – p. 35
Construção de um Heap
1 nível
46 0
2 3
41 34 1
4 5 6 7
23 30 21 14 2
8 9 10 11 12
17 12 15 13 10 3
1 2 3 4 5 6 7 8 9 10 11 12
46 41 34 23 30 21 14 17 12 15 13 10
Aula 06 - Heapsort – p. 36
Construção de um Heap
Recebe um vetor A[1 . . . n] e rearranja A para que seja
heap.
BuildHeap (A, n)
1: para i = ⌊n/2⌋ até 1 faça
2: Heapify(A, n, i)
Relação invariante:
(i0) no início de cada iteração, i + 1, . . . , n são raízes de
heaps.
Aula 06 - Heapsort – p. 37
Construção de um Heap
Recebe um vetor A[1 . . . n] e rearranja A para que seja
heap.
BuildHeap (A, n)
1: para i = ⌊n/2⌋ até 1 faça
2: Heapify(A, n, i)
Relação invariante:
(i0) no início de cada iteração, i + 1, . . . , n são raízes de
heaps.
Aula 06 - Heapsort – p. 37
T (n) é O(n)
Prova O consumo de Heapify(A, n, i) é proporcional a
h = ⌊lg ni ⌋. Logo,
⌊lg n⌋
X n
T (n) ≤ ⌈ ⌉ h
2h+1
h=1
⌊lg n⌋
X n
≤ h
h (Exercício)
2
h=1
!
1 2 3 ⌊lg n⌋
≤ n 1
+ 2 + 3 + · · · + ⌊lg n⌋
2 2 2 2
1/2
< n
(1 − 1/2)2
= 2n = O(n).
Aula 06 - Heapsort – p. 38
Conclusão
O consumo de tempo do algoritmo Heapify é Θ(n).
Aula 06 - Heapsort – p. 39
Heap sort
Interferência! 1 nível
46 0
2 3
41 34 1
4 5 6 7
23 30 21 14 2
8 9 10 11 12
17 12 15 13 10 3
1 2 3 4 5 6 7 8 9 10 11 12
46 41 34 23 30 21 14 17 12 15 13 10
Aula 06 - Heapsort – p. 40
Heap sort
Interferência! 1 nível
10 0
2 3
41 34 1
4 5 6 7
23 30 21 14 2
8 9 10 11 12
17 12 15 13 46 3
1 2 3 4 5 6 7 8 9 10 11 12
10 41 34 23 30 21 14 17 12 15 13 46
Aula 06 - Heapsort – p. 41
Heap sort
Interferência! 1 nível
41 0
2 3
10 34 1
4 5 6 7
23 30 21 14 2
8 9 10 11 12
17 12 15 13 46 3
1 2 3 4 5 6 7 8 9 10 11 12
41 10 34 23 30 21 14 17 12 15 13 46
Aula 06 - Heapsort – p. 42
Heap sort
Interferência! 1 nível
41 0
2 3
30 34 1
4 5 6 7
23 10 21 14 2
8 9 10 11 12
17 12 15 13 46 3
1 2 3 4 5 6 7 8 9 10 11 12
41 30 34 23 10 21 14 17 12 15 13 46
Aula 06 - Heapsort – p. 43
Heap sort
Interferência! 1 nível
41 0
2 3
30 34 1
4 5 6 7
23 15 21 14 2
8 9 10 11 12
17 12 10 13 46 3
1 2 3 4 5 6 7 8 9 10 11 12
41 30 34 23 15 21 14 17 12 10 13 46
Aula 06 - Heapsort – p. 44
Heap sort
Interferência! 1 nível
41 0
2 3
30 34 1
4 5 6 7
23 15 21 14 2
8 9 10 11 12
17 12 10 13 46 3
1 2 3 4 5 6 7 8 9 10 11 12
41 30 34 23 15 21 14 17 12 10 13 46
Aula 06 - Heapsort – p. 45
Heap sort
Interferência! 1 nível
13 0
2 3
30 34 1
4 5 6 7
23 15 21 14 2
8 9 10 11 12
17 12 10 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
13 30 34 23 15 21 14 17 12 10 41 46
Aula 06 - Heapsort – p. 46
Heap sort
Interferência! 1 nível
13 0
2 3
30 34 1
4 5 6 7
23 15 21 14 2
8 9 10 11 12
17 12 10 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
13 30 34 23 15 21 14 17 12 10 41 46
Aula 06 - Heapsort – p. 47
Heap sort
Interferência! 1 nível
34 0
2 3
30 13 1
4 5 6 7
23 15 21 14 2
8 9 10 11 12
17 12 10 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
34 30 13 23 15 21 14 17 12 10 41 46
Aula 06 - Heapsort – p. 48
Heap sort
Interferência! 1 nível
34 0
2 3
30 21 1
4 5 6 7
23 15 13 14 2
8 9 10 11 12
17 12 10 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
34 30 21 23 15 13 14 17 12 10 41 46
Aula 06 - Heapsort – p. 49
Heap sort
Interferência! 1 nível
34 0
2 3
30 21 1
4 5 6 7
23 15 13 14 2
8 9 10 11 12
17 12 10 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
34 30 21 23 15 13 14 17 12 10 41 46
Aula 06 - Heapsort – p. 50
Heap sort
Interferência! 1 nível
10 0
2 3
30 21 1
4 5 6 7
23 15 13 14 2
8 9 10 11 12
17 12 34 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
10 30 21 23 15 13 14 17 12 34 41 46
Aula 06 - Heapsort – p. 51
Heap sort
Interferência! 1 nível
10 0
2 3
30 21 1
4 5 6 7
23 15 13 14 2
8 9 10 11 12
17 12 34 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
10 30 21 23 15 13 14 17 12 34 41 46
Aula 06 - Heapsort – p. 52
Heap sort
Interferência! 1 nível
30 0
2 3
10 21 1
4 5 6 7
23 15 13 14 2
8 9 10 11 12
17 12 34 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
30 10 21 23 15 13 14 17 12 34 41 46
Aula 06 - Heapsort – p. 53
Heap sort
Interferência! 1 nível
30 0
2 3
23 21 1
4 5 6 7
10 15 13 14 2
8 9 10 11 12
17 12 34 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
30 23 21 10 15 13 14 17 12 34 41 46
Aula 06 - Heapsort – p. 54
Heap sort
Interferência! 1 nível
30 0
2 3
23 21 1
4 5 6 7
17 15 13 14 2
8 9 10 11 12
10 12 34 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
30 23 21 17 15 13 14 10 12 34 41 46
Aula 06 - Heapsort – p. 55
Heap sort
Interferência! 1 nível
30 0
2 3
23 21 1
4 5 6 7
17 15 13 14 2
8 9 10 11 12
10 12 34 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
30 23 21 17 15 13 14 10 12 34 41 46
Aula 06 - Heapsort – p. 56
Heap sort
Interferência! 1 nível
12 0
2 3
23 21 1
4 5 6 7
17 15 13 14 2
8 9 10 11 12
10 30 34 41 46 3
1 2 3 4 5 6 7 8 9 10 11 12
12 23 21 17 15 13 14 10 30 34 41 46
Aula 06 - Heapsort – p. 57
Heap sort
Algoritmo rearranja A[1 . . . n] em ordem crescente.
Heapsort(A, n)
1: BuildHeap(A, n) ✄ pré-processamento
2: m = n
3: para i = n até 2 faça
4: A[1] ↔ A[i]
5: m = m − 1
6: Heapify(A, m, 1)
Aula 06 - Heapsort – p. 58
Consumo de tempo
linha todas as execuções da linha
1 = Θ(n)
2 = Θ(1)
3 = Θ(n)
4 = Θ(n)
5 = Θ(n)
6 = nO(lg n)
Aula 06 - Heapsort – p. 59
Fila de prioridades
Estrutura de dados relacionada com um conjunto S de
elementos, cada um deles associado a uma chave
Uma fila de prioridades suporta as seguintes operações
Aula 06 - Heapsort – p. 60
Fila de prioridades
Extrai_max(A, n)
se n < 1 então
“Erro”
senão
x = A[1]
A[1] = A[n]
n=n−1
Heapipy(A, 1, n)
devolva x
Complexidade: O(lg n)
Aula 06 - Heapsort – p. 61