(ACH2002) Introdução à Análise de Algoritmos - Aula 17
1. Aula 17 – Heaps e Heapsort
Norton Trevisan Roman
norton@usp.br
18 de outubro de 2018
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 1 / 17
2. Heaps
Mantendo a Propriedade do Heap
Vimos que, no caso de
alguma mudan¸ca no
heap alterar sua
propriedade:
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 2 / 17
3. Heaps
Mantendo a Propriedade do Heap
Vimos que, no caso de
alguma mudan¸ca no
heap alterar sua
propriedade:
Trocamos o elemento
problem´atico de lugar com
o maior filho
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 2 / 17
4. Heaps
Mantendo a Propriedade do Heap
Vimos que, no caso de
alguma mudan¸ca no
heap alterar sua
propriedade:
Trocamos o elemento
problem´atico de lugar com
o maior filho
16
1
14
2
10
3
4
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 2 / 17
5. Heaps
Mantendo a Propriedade do Heap
Vimos que, no caso de
alguma mudan¸ca no
heap alterar sua
propriedade:
Trocamos o elemento
problem´atico de lugar com
o maior filho
16
1
14
2
10
3
4
4
7
5
9
6
3
7
2
8
8
9
1
10
E repetimos o procedimento enquanto houver
viola¸c˜ao da propriedade
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 2 / 17
6. Heaps
Mantendo a Propriedade do Heap
Vimos que, no caso de
alguma mudan¸ca no
heap alterar sua
propriedade:
Trocamos o elemento
problem´atico de lugar com
o maior filho
16
1
14
2
10
3
8
4
7
5
9
6
3
7
2
8
4
9
1
10
E repetimos o procedimento enquanto houver
viola¸c˜ao da propriedade
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 2 / 17
7. Heaps
Mantendo a Propriedade do Heap
Vimos que, no caso de
alguma mudan¸ca no
heap alterar sua
propriedade:
Trocamos o elemento
problem´atico de lugar com
o maior filho
16
1
14
2
10
3
8
4
7
5
9
6
3
7
2
8
4
9
1
10
E repetimos o procedimento enquanto houver
viola¸c˜ao da propriedade
Empurrando assim o elemento problem´atico para baixo no
heap, at´e seu devido lugar
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 2 / 17
8. Heaps
Mantendo a Propriedade do Heap
Vimos tamb´em o procedimento
void refazHeapMax(int A[], int i, int
compHeap)
que fazia essa manuten¸c˜ao no heap em O(log n)
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 3 / 17
9. Heaps
Mantendo a Propriedade do Heap
Vimos tamb´em o procedimento
void refazHeapMax(int A[], int i, int
compHeap)
que fazia essa manuten¸c˜ao no heap em O(log n)
Como ent˜ao constru´ımos um heap?
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 3 / 17
10. Heaps
Mantendo a Propriedade do Heap
Vimos tamb´em o procedimento
void refazHeapMax(int A[], int i, int
compHeap)
que fazia essa manuten¸c˜ao no heap em O(log n)
Como ent˜ao constru´ımos um heap?
Uma maneira ´e usar nosso refazHeapMax para
converter um arranjo A[1..n] em um heap m´aximo
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 3 / 17
11. Heaps
Construindo o Heap
Note que, quando representamos o heap com o
arranjo A[1..n], as folhas ficam nos n´os que v˜ao de
n/2 + 1 a n
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 4 / 17
12. Heaps
Construindo o Heap
Note que, quando representamos o heap com o
arranjo A[1..n], as folhas ficam nos n´os que v˜ao de
n/2 + 1 a n
Ou, alternativamente, nos elementos de ´ındice n/2 a
n − 1, se tomarmos o arranjo como A[0..n − 1]
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 4 / 17
13. Heaps
Construindo o Heap
Note que, quando representamos o heap com o
arranjo A[1..n], as folhas ficam nos n´os que v˜ao de
n/2 + 1 a n
Ou, alternativamente, nos elementos de ´ındice n/2 a
n − 1, se tomarmos o arranjo como A[0..n − 1]
Mesmo? Suponha o arranjo A[0..n − 1]
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 4 / 17
14. Heaps
Construindo o Heap
Note que, quando representamos o heap com o
arranjo A[1..n], as folhas ficam nos n´os que v˜ao de
n/2 + 1 a n
Ou, alternativamente, nos elementos de ´ındice n/2 a
n − 1, se tomarmos o arranjo como A[0..n − 1]
Mesmo? Suponha o arranjo A[0..n − 1]
Imagine que A[ n/2 ] . . . A[n − 1] n˜ao contenham apenas
folhas
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 4 / 17
15. Heaps
Construindo o Heap
Note que, quando representamos o heap com o
arranjo A[1..n], as folhas ficam nos n´os que v˜ao de
n/2 + 1 a n
Ou, alternativamente, nos elementos de ´ındice n/2 a
n − 1, se tomarmos o arranjo como A[0..n − 1]
Mesmo? Suponha o arranjo A[0..n − 1]
Imagine que A[ n/2 ] . . . A[n − 1] n˜ao contenham apenas
folhas
Isso significa que existe (pelo menos) um elemento
A[k], n/2 ≤ k ≤ n − 1 que n˜ao ´e folha
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 4 / 17
16. Heaps
Construindo o Heap
O que significa que existe um A[k ], n/2 ≤ k ≤ n − 1 no
heap que ´e filho desse elemento A[k]
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 5 / 17
17. Heaps
Construindo o Heap
O que significa que existe um A[k ], n/2 ≤ k ≤ n − 1 no
heap que ´e filho desse elemento A[k]
Mas, pela regra do heap, um filho de A[k] estaria nas
posi¸c˜oes k = 2k + 1 ou k = 2k + 2
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 5 / 17
18. Heaps
Construindo o Heap
O que significa que existe um A[k ], n/2 ≤ k ≤ n − 1 no
heap que ´e filho desse elemento A[k]
Mas, pela regra do heap, um filho de A[k] estaria nas
posi¸c˜oes k = 2k + 1 ou k = 2k + 2
Como k ≥ n/2 , ent˜ao esse elemento estaria em
k ≥ 2n/2 + 1 ou em k ≥ 2n/2 + 2
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 5 / 17
19. Heaps
Construindo o Heap
O que significa que existe um A[k ], n/2 ≤ k ≤ n − 1 no
heap que ´e filho desse elemento A[k]
Mas, pela regra do heap, um filho de A[k] estaria nas
posi¸c˜oes k = 2k + 1 ou k = 2k + 2
Como k ≥ n/2 , ent˜ao esse elemento estaria em
k ≥ 2n/2 + 1 ou em k ≥ 2n/2 + 2
Ou seja, k ≥ n + 1 ou em k ≥ n + 2. Fora, portanto, do
arranjo
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 5 / 17
20. Heaps
Construindo o Heap
O que significa que existe um A[k ], n/2 ≤ k ≤ n − 1 no
heap que ´e filho desse elemento A[k]
Mas, pela regra do heap, um filho de A[k] estaria nas
posi¸c˜oes k = 2k + 1 ou k = 2k + 2
Como k ≥ n/2 , ent˜ao esse elemento estaria em
k ≥ 2n/2 + 1 ou em k ≥ 2n/2 + 2
Ou seja, k ≥ n + 1 ou em k ≥ n + 2. Fora, portanto, do
arranjo
Ent˜ao sim, as folhas ficam nos n´os que v˜ao de n/2 + 1 a n
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 5 / 17
21. Heaps
Construindo o Heap
As folhas de um heap podem ser vistas como heaps
de 1 ´unico elemento
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 6 / 17
22. Heaps
Construindo o Heap
As folhas de um heap podem ser vistas como heaps
de 1 ´unico elemento
Podemos ent˜ao considerar cada elemento A[k],
n/2 ≤ k ≤ n − 1 como um heap
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 6 / 17
23. Heaps
Construindo o Heap
As folhas de um heap podem ser vistas como heaps
de 1 ´unico elemento
Podemos ent˜ao considerar cada elemento A[k],
n/2 ≤ k ≤ n − 1 como um heap
E a partir desses, construir o resto do heap, numa estrat´egia
bottom-up
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 6 / 17
24. Heaps
Construindo o Heap
As folhas de um heap podem ser vistas como heaps
de 1 ´unico elemento
Podemos ent˜ao considerar cada elemento A[k],
n/2 ≤ k ≤ n − 1 como um heap
E a partir desses, construir o resto do heap, numa estrat´egia
bottom-up
Como?
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 6 / 17
25. Heaps
Construindo o Heap
Iniciamos com esses heaps de 1 elemento (A[ n/2 ]
at´e A[n − 1])
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 7 / 17
26. Heaps
Construindo o Heap
Iniciamos com esses heaps de 1 elemento (A[ n/2 ]
at´e A[n − 1])
Chamamos ent˜ao refazHeapMax a partir da
posi¸c˜ao n/2 − 1 descendo at´e 0
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 7 / 17
27. Heaps
Construindo o Heap
Iniciamos com esses heaps de 1 elemento (A[ n/2 ]
at´e A[n − 1])
Chamamos ent˜ao refazHeapMax a partir da
posi¸c˜ao n/2 − 1 descendo at´e 0
Como se tiv´essemos adicionado um elemento ao heap, em
seu in´ıcio, e agora tiv´essemos que manter sua propriedade
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 7 / 17
28. Heaps
Construindo o Heap
Iniciamos com esses heaps de 1 elemento (A[ n/2 ]
at´e A[n − 1])
Chamamos ent˜ao refazHeapMax a partir da
posi¸c˜ao n/2 − 1 descendo at´e 0
Como se tiv´essemos adicionado um elemento ao heap, em
seu in´ıcio, e agora tiv´essemos que manter sua propriedade
Repetimos ent˜ao a partir da posi¸c˜ao n/2 − 2 etc,
at´e a posi¸c˜ao 0
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 7 / 17
29. Heaps
Construindo o Heap
Iniciamos com esses heaps de 1 elemento (A[ n/2 ]
at´e A[n − 1])
Chamamos ent˜ao refazHeapMax a partir da
posi¸c˜ao n/2 − 1 descendo at´e 0
Como se tiv´essemos adicionado um elemento ao heap, em
seu in´ıcio, e agora tiv´essemos que manter sua propriedade
Repetimos ent˜ao a partir da posi¸c˜ao n/2 − 2 etc,
at´e a posi¸c˜ao 0
Ou seja, um a um adicionamos os demais elementos
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 7 / 17
30. Heaps
Construindo o Heap
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1; i >= 0; i--)
refazHeapMax(A, i, compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 8 / 17
31. Heaps
Construindo o Heap
Para cada elemento, da
metade at´e a primeira posi¸c˜ao
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1; i >= 0; i--)
refazHeapMax(A, i, compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 8 / 17
32. Heaps
Construindo o Heap
Garanto a propriedade do
heap a partir desse elemento
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1; i >= 0; i--)
refazHeapMax(A, i, compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 8 / 17
33. Heaps
Construindo o Heap
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
34. Heaps
Construindo o Heap
4
0
1
1
3
2
2
3
16
4
9
5
10
6
14
7
8
8
7
9
4 1 3 2 16 9 10 14 8 7
0 1 2 3 4 5 6 7 8 9
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
35. Heaps
Construindo o Heap
4
0
1
1
3
2
2
3
16
4
9
5
10
6
14
7
8
8
7
9
4 1 3 2 16 9 10 14 8 7
0 1 2 3 4 5 6 7 8 9
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
36. Heaps
Construindo o Heap
4
0
1
1
3
2
2
3
16
4
9
5
10
6
14
7
8
8
7
9
4 1 3 2 16 9 10 14 8 7
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
37. Heaps
Construindo o Heap
4
0
1
1
3
2
2
3
16
4
9
5
10
6
14
7
8
8
7
9
4 1 3 2 16 9 10 14 8 7
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
38. Heaps
Construindo o Heap
4
0
1
1
3
2
2
3
16
4
9
5
10
6
14
7
8
8
7
9
4 1 3 2 16 9 10 14 8 7
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
39. Heaps
Construindo o Heap
4
0
1
1
3
2
14
3
16
4
9
5
10
6
2
7
8
8
7
9
4 1 3 14 16 9 10 2 8 7
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
40. Heaps
Construindo o Heap
4
0
1
1
3
2
14
3
16
4
9
5
10
6
2
7
8
8
7
9
4 1 3 14 16 9 10 2 8 7
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
41. Heaps
Construindo o Heap
4
0
1
1
10
2
14
3
16
4
9
5
3
6
2
7
8
8
7
9
4 1 10 14 16 9 3 2 8 7
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
42. Heaps
Construindo o Heap
4
0
1
1
10
2
14
3
16
4
9
5
3
6
2
7
8
8
7
9
4 1 10 14 16 9 3 2 8 7
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
43. Heaps
Construindo o Heap
4
0
16
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
4 16 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
44. Heaps
Construindo o Heap
4
0
16
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
4 16 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
45. Heaps
Construindo o Heap
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 9 / 17
46. Heaps
Construindo o Heap
E qual a complexidade
desse c´odigo?
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 10 / 17
47. Heaps
Construindo o Heap
E qual a complexidade
desse c´odigo?
O(log n)
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 10 / 17
48. Heaps
Construindo o Heap
E qual a complexidade
desse c´odigo?
O(log n)×O(n)
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 10 / 17
49. Heaps
Construindo o Heap
E qual a complexidade
desse c´odigo?
O(log n)×O(n)
Portanto, O(n log n)
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 10 / 17
50. Heaps
Construindo o Heap
E qual a complexidade
desse c´odigo?
O(log n)×O(n)
Portanto, O(n log n)
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Mas isso pode melhorar...
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 10 / 17
51. Heaps
Construindo o Heap
E qual a complexidade
desse c´odigo?
O(log n)×O(n)
Portanto, O(n log n)
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Mas isso pode melhorar...
De fato, pode-se demonstrar que um limite mais
apertado seria O(n)
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 10 / 17
52. Heaps
Construindo o Heap
E qual a complexidade
desse c´odigo?
O(log n)×O(n)
Portanto, O(n log n)
void constroiHeapMax(int[] A) {
int compHeap = A.length;
for(int i = A.length/2 - 1;
i >= 0; i--)
refazHeapMax(A,i,compHeap);
}
Mas isso pode melhorar...
De fato, pode-se demonstrar que um limite mais
apertado seria O(n)
Ver em Cormen et al. “Introduction to Algorithms”. 2a ed.
MIT Press, 2001. Pp. 133-135.
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 10 / 17
54. Projeto por Indu¸c˜ao Fraca
Quarta Alternativa
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 12 / 17
55. Projeto por Indu¸c˜ao Fraca
Quarta Alternativa
Base: n = 1. Um ´unico elemento est´a ordenado
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 12 / 17
56. Projeto por Indu¸c˜ao Fraca
Quarta Alternativa
Base: n = 1. Um ´unico elemento est´a ordenado
H.I.: Sei ordenar um conjunto de n − 1 ≥ 1 valores
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 12 / 17
57. Projeto por Indu¸c˜ao Fraca
Quarta Alternativa
Base: n = 1. Um ´unico elemento est´a ordenado
H.I.: Sei ordenar um conjunto de n − 1 ≥ 1 valores
Passo:
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 12 / 17
58. Projeto por Indu¸c˜ao Fraca
Quarta Alternativa
Base: n = 1. Um ´unico elemento est´a ordenado
H.I.: Sei ordenar um conjunto de n − 1 ≥ 1 valores
Passo:
Seja S um conjunto de n ≥ 2 valores, organizados na forma
de um heap m´aximo
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 12 / 17
59. Projeto por Indu¸c˜ao Fraca
Quarta Alternativa
Base: n = 1. Um ´unico elemento est´a ordenado
H.I.: Sei ordenar um conjunto de n − 1 ≥ 1 valores
Passo:
Seja S um conjunto de n ≥ 2 valores, organizados na forma
de um heap m´aximo
Sendo S um heap m´aximo, o maior elemento est´a em S1.
Trocamos esse elemento por Sn, restaurando o heap em
S − Sn. Por hip´otese de indu¸c˜ao, sei ordenar a sequˆencia
S − Sn, e assim obtemos S ordenado
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 12 / 17
60. Projeto por Indu¸c˜ao Fraca
Quarta Alternativa
Base: n = 1. Um ´unico elemento est´a ordenado
H.I.: Sei ordenar um conjunto de n − 1 ≥ 1 valores
Passo:
Seja S um conjunto de n ≥ 2 valores, organizados na forma
de um heap m´aximo
Sendo S um heap m´aximo, o maior elemento est´a em S1.
Trocamos esse elemento por Sn, restaurando o heap em
S − Sn. Por hip´otese de indu¸c˜ao, sei ordenar a sequˆencia
S − Sn, e assim obtemos S ordenado
(HeapSort)
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 12 / 17
61. HeapSort
Projeto
O projeto do Heapsort ´e essencialmente o mesmo da
ordena¸c˜ao por Sele¸c˜ao
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 13 / 17
62. HeapSort
Projeto
O projeto do Heapsort ´e essencialmente o mesmo da
ordena¸c˜ao por Sele¸c˜ao
Selecionamos e posicionamos o maior (ou menor) elemento
do conjunto
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 13 / 17
63. HeapSort
Projeto
O projeto do Heapsort ´e essencialmente o mesmo da
ordena¸c˜ao por Sele¸c˜ao
Selecionamos e posicionamos o maior (ou menor) elemento
do conjunto
Aplicamos a hip´otese de indu¸c˜ao para ordenar os elementos
restantes
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 13 / 17
64. HeapSort
Projeto
O projeto do Heapsort ´e essencialmente o mesmo da
ordena¸c˜ao por Sele¸c˜ao
Selecionamos e posicionamos o maior (ou menor) elemento
do conjunto
Aplicamos a hip´otese de indu¸c˜ao para ordenar os elementos
restantes
A diferen¸ca ´e que no HeapSort utilizamos um heap
para selecionar o maior (ou menor) elemento de
forma eficiente
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 13 / 17
65. HeapSort
C´odigo
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 14 / 17
66. HeapSort
C´odigo
Transforma o ar-
ranjo em um heap
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 14 / 17
67. HeapSort
C´odigo
Coloca o maior
elemento ao final do
arranjo a ser ordenado
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 14 / 17
68. HeapSort
C´odigo
Verifica se a mudan¸ca
feita n˜ao violou
a propriedade no
heap restante, de
n − 1 elementos
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 14 / 17
69. HeapSort
C´odigo
Repete a opera¸c˜ao
para o heap de n − 1
elementos (T(n − 1))
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 14 / 17
70. HeapSort
C´odigo
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 15 / 17
113. HeapSort
C´odigo
Qual a complexidade
desse c´odigo?
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 16 / 17
114. HeapSort
C´odigo
Qual a complexidade
desse c´odigo?
O(n)
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 16 / 17
115. HeapSort
C´odigo
Qual a complexidade
desse c´odigo?
O(n)
+(n − 1)
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 16 / 17
116. HeapSort
C´odigo
Qual a complexidade
desse c´odigo?
O(n)
+(n − 1)×O(log n)
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 16 / 17
117. HeapSort
C´odigo
Qual a complexidade
desse c´odigo?
O(n)
+(n − 1)×O(log n)
O(n log n) portanto
void heapSort(int A[]) {
int i, compHeap, temp;
compHeap = A.length;
constroiHeapMax(A);
for(i = A.length-1; i > 0; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
compHeap--;
refazHeapMax(A, 0, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 16 / 17
118. Referˆencias
Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L.,
Stein, Clifford. Introduction to Algorithms. 2a ed. MIT Press,
2001.
Ziviani, Nivio. Projeto de Algoritmos: com implementa¸c˜oes
em Java e C++. Cengage. 2007.
Slides dos professores Delano Beder e Marcos Chain
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 17 / 17