SlideShare uma empresa Scribd logo
1 de 118
Baixar para ler offline
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
HeapSort
HeapSort
Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 11 / 17
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
HeapSort
C´odigo
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
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
HeapSort
C´odigo
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
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
HeapSort
C´odigo
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
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
HeapSort
C´odigo
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
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
HeapSort
C´odigo
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 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
HeapSort
C´odigo
1
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
16
9
1 14 10 8 7 9 3 2 4 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
16
9
1 14 10 8 7 9 3 2 4 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
14
0
8
1
10
2
4
3
7
4
9
5
3
6
2
7
1
8
16
9
14 8 10 4 7 9 3 2 1 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
14
0
8
1
10
2
4
3
7
4
9
5
3
6
2
7
1
8
16
9
14 8 10 4 7 9 3 2 1 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
8
1
10
2
4
3
7
4
9
5
3
6
2
7
14
8
16
9
1 8 10 4 7 9 3 2 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
8
1
10
2
4
3
7
4
9
5
3
6
2
7
14
8
16
9
1 8 10 4 7 9 3 2 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
10
0
8
1
9
2
4
3
7
4
1
5
3
6
2
7
14
8
16
9
10 8 9 4 7 1 3 2 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
10
0
8
1
9
2
4
3
7
4
1
5
3
6
2
7
14
8
16
9
10 8 9 4 7 1 3 2 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
2
0
8
1
9
2
4
3
7
4
1
5
3
6
10
7
14
8
16
9
2 8 9 4 7 1 3 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
2
0
8
1
9
2
4
3
7
4
1
5
3
6
10
7
14
8
16
9
2 8 9 4 7 1 3 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
9
0
8
1
3
2
4
3
7
4
1
5
2
6
10
7
14
8
16
9
9 8 3 4 7 1 2 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
9
0
8
1
3
2
4
3
7
4
1
5
2
6
10
7
14
8
16
9
9 8 3 4 7 1 2 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
2
0
8
1
3
2
4
3
7
4
1
5
9
6
10
7
14
8
16
9
2 8 3 4 7 1 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
2
0
8
1
3
2
4
3
7
4
1
5
9
6
10
7
14
8
16
9
2 8 3 4 7 1 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
8
0
7
1
3
2
4
3
2
4
1
5
9
6
10
7
14
8
16
9
8 7 3 4 2 1 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
8
0
7
1
3
2
4
3
2
4
1
5
9
6
10
7
14
8
16
9
8 7 3 4 2 1 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
7
1
3
2
4
3
2
4
8
5
9
6
10
7
14
8
16
9
1 7 3 4 2 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
7
1
3
2
4
3
2
4
8
5
9
6
10
7
14
8
16
9
1 7 3 4 2 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
7
0
4
1
3
2
1
3
2
4
8
5
9
6
10
7
14
8
16
9
7 4 3 1 2 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
7
0
4
1
3
2
1
3
2
4
8
5
9
6
10
7
14
8
16
9
7 4 3 1 2 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
2
0
4
1
3
2
1
3
7
4
8
5
9
6
10
7
14
8
16
9
2 4 3 1 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
2
0
4
1
3
2
1
3
7
4
8
5
9
6
10
7
14
8
16
9
2 4 3 1 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
4
0
2
1
3
2
1
3
7
4
8
5
9
6
10
7
14
8
16
9
4 2 3 1 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
4
0
2
1
3
2
1
3
7
4
8
5
9
6
10
7
14
8
16
9
4 2 3 1 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
2
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
1 2 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
2
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
1 2 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
3
0
2
1
1
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
3 2 1 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
3
0
2
1
1
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
3 2 1 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
2
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
1 2 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
2
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
1 2 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
2
0
1
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
2 1 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
2
0
1
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
2 1 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
2
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
1 2 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
2
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
1 2 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
2
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
1 2 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
2
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
1 2 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
HeapSort
C´odigo
1
0
2
1
3
2
4
3
7
4
8
5
9
6
10
7
14
8
16
9
1 2 3 4 7 8 9 10 14 16
0 1 2 3 4 5 6 7 8 9
i
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
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
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
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
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
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
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

Mais conteúdo relacionado

Mais de Norton Trevisan Roman

(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 04
(ACH2044) Inteligência Artificial - Aula 04(ACH2044) Inteligência Artificial - Aula 04
(ACH2044) Inteligência Artificial - Aula 04Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 03
(ACH2044) Inteligência Artificial - Aula 03(ACH2044) Inteligência Artificial - Aula 03
(ACH2044) Inteligência Artificial - Aula 03Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 02
(ACH2044) Inteligência Artificial - Aula 02(ACH2044) Inteligência Artificial - Aula 02
(ACH2044) Inteligência Artificial - Aula 02Norton Trevisan Roman
 
(ACH2001) Introdução à Programação - Aula 23
(ACH2001) Introdução à Programação - Aula 23(ACH2001) Introdução à Programação - Aula 23
(ACH2001) Introdução à Programação - Aula 23Norton Trevisan Roman
 
(ACH2001) Introdução à Programação - Aula 22
(ACH2001) Introdução à Programação - Aula 22(ACH2001) Introdução à Programação - Aula 22
(ACH2001) Introdução à Programação - Aula 22Norton Trevisan Roman
 
(ACH2001) Introdução à Programação - Aula 21
(ACH2001) Introdução à Programação - Aula 21(ACH2001) Introdução à Programação - Aula 21
(ACH2001) Introdução à Programação - Aula 21Norton Trevisan Roman
 

Mais de Norton Trevisan Roman (20)

(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18
 
(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17
 
(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16
 
(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15
 
(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14
 
(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13
 
(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12
 
(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11
 
(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10
 
(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09
 
(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08
 
(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07
 
(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06
 
(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05
 
(ACH2044) Inteligência Artificial - Aula 04
(ACH2044) Inteligência Artificial - Aula 04(ACH2044) Inteligência Artificial - Aula 04
(ACH2044) Inteligência Artificial - Aula 04
 
(ACH2044) Inteligência Artificial - Aula 03
(ACH2044) Inteligência Artificial - Aula 03(ACH2044) Inteligência Artificial - Aula 03
(ACH2044) Inteligência Artificial - Aula 03
 
(ACH2044) Inteligência Artificial - Aula 02
(ACH2044) Inteligência Artificial - Aula 02(ACH2044) Inteligência Artificial - Aula 02
(ACH2044) Inteligência Artificial - Aula 02
 
(ACH2001) Introdução à Programação - Aula 23
(ACH2001) Introdução à Programação - Aula 23(ACH2001) Introdução à Programação - Aula 23
(ACH2001) Introdução à Programação - Aula 23
 
(ACH2001) Introdução à Programação - Aula 22
(ACH2001) Introdução à Programação - Aula 22(ACH2001) Introdução à Programação - Aula 22
(ACH2001) Introdução à Programação - Aula 22
 
(ACH2001) Introdução à Programação - Aula 21
(ACH2001) Introdução à Programação - Aula 21(ACH2001) Introdução à Programação - Aula 21
(ACH2001) Introdução à Programação - Aula 21
 

Último

PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...HELENO FAVACHO
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfHELENO FAVACHO
 
About Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de HotéisAbout Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de Hotéisines09cachapa
 
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia TecnologiaPROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia TecnologiaHELENO FAVACHO
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdfmarlene54545
 
matematica aula didatica prática e tecni
matematica aula didatica prática e tecnimatematica aula didatica prática e tecni
matematica aula didatica prática e tecniCleidianeCarvalhoPer
 
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...Francisco Márcio Bezerra Oliveira
 
Aula 03 - Filogenia14+4134684516498481.pptx
Aula 03 - Filogenia14+4134684516498481.pptxAula 03 - Filogenia14+4134684516498481.pptx
Aula 03 - Filogenia14+4134684516498481.pptxandrenespoli3
 
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasJogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasSocorro Machado
 
Projeto de Extensão - DESENVOLVIMENTO BACK-END.pdf
Projeto de Extensão - DESENVOLVIMENTO BACK-END.pdfProjeto de Extensão - DESENVOLVIMENTO BACK-END.pdf
Projeto de Extensão - DESENVOLVIMENTO BACK-END.pdfHELENO FAVACHO
 
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...andreiavys
 
Camadas da terra -Litosfera conteúdo 6º ano
Camadas da terra -Litosfera  conteúdo 6º anoCamadas da terra -Litosfera  conteúdo 6º ano
Camadas da terra -Litosfera conteúdo 6º anoRachel Facundo
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesFabianeMartins35
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptssuser2b53fe
 
Texto dramático com Estrutura e exemplos.ppt
Texto dramático com Estrutura e exemplos.pptTexto dramático com Estrutura e exemplos.ppt
Texto dramático com Estrutura e exemplos.pptjricardo76
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTailsonSantos1
 
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptxSlides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptxLuizHenriquedeAlmeid6
 
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUAO PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUAJulianeMelo17
 
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdfTCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdfamarianegodoi
 

Último (20)

PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
 
About Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de HotéisAbout Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de Hotéis
 
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia TecnologiaPROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
 
matematica aula didatica prática e tecni
matematica aula didatica prática e tecnimatematica aula didatica prática e tecni
matematica aula didatica prática e tecni
 
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
LISTA DE EXERCICIOS envolveto grandezas e medidas e notação cientifica 1 ANO ...
 
Aula 03 - Filogenia14+4134684516498481.pptx
Aula 03 - Filogenia14+4134684516498481.pptxAula 03 - Filogenia14+4134684516498481.pptx
Aula 03 - Filogenia14+4134684516498481.pptx
 
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasJogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
 
Projeto de Extensão - DESENVOLVIMENTO BACK-END.pdf
Projeto de Extensão - DESENVOLVIMENTO BACK-END.pdfProjeto de Extensão - DESENVOLVIMENTO BACK-END.pdf
Projeto de Extensão - DESENVOLVIMENTO BACK-END.pdf
 
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...
 
Camadas da terra -Litosfera conteúdo 6º ano
Camadas da terra -Litosfera  conteúdo 6º anoCamadas da terra -Litosfera  conteúdo 6º ano
Camadas da terra -Litosfera conteúdo 6º ano
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.ppt
 
Texto dramático com Estrutura e exemplos.ppt
Texto dramático com Estrutura e exemplos.pptTexto dramático com Estrutura e exemplos.ppt
Texto dramático com Estrutura e exemplos.ppt
 
Aula sobre o Imperialismo Europeu no século XIX
Aula sobre o Imperialismo Europeu no século XIXAula sobre o Imperialismo Europeu no século XIX
Aula sobre o Imperialismo Europeu no século XIX
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
 
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptxSlides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
 
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUAO PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
O PLANETA TERRA E SEU SATÉLITE NATURAL - LUA
 
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdfTCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
TCC_MusicaComoLinguagemNaAlfabetização-ARAUJOfranklin-UFBA.pdf
 

(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
  • 53. HeapSort HeapSort Norton Trevisan Romannorton@usp.br Aula 17 – Heaps e Heapsort 18 de outubro de 2018 11 / 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
  • 71. HeapSort C´odigo 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 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
  • 72. HeapSort C´odigo 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 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
  • 73. HeapSort C´odigo 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 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
  • 74. HeapSort C´odigo 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 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
  • 75. HeapSort C´odigo 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 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
  • 76. HeapSort C´odigo 1 0 14 1 10 2 8 3 7 4 9 5 3 6 2 7 4 8 16 9 1 14 10 8 7 9 3 2 4 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 77. HeapSort C´odigo 1 0 14 1 10 2 8 3 7 4 9 5 3 6 2 7 4 8 16 9 1 14 10 8 7 9 3 2 4 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 78. HeapSort C´odigo 14 0 8 1 10 2 4 3 7 4 9 5 3 6 2 7 1 8 16 9 14 8 10 4 7 9 3 2 1 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 79. HeapSort C´odigo 14 0 8 1 10 2 4 3 7 4 9 5 3 6 2 7 1 8 16 9 14 8 10 4 7 9 3 2 1 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 80. HeapSort C´odigo 1 0 8 1 10 2 4 3 7 4 9 5 3 6 2 7 14 8 16 9 1 8 10 4 7 9 3 2 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 81. HeapSort C´odigo 1 0 8 1 10 2 4 3 7 4 9 5 3 6 2 7 14 8 16 9 1 8 10 4 7 9 3 2 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 82. HeapSort C´odigo 10 0 8 1 9 2 4 3 7 4 1 5 3 6 2 7 14 8 16 9 10 8 9 4 7 1 3 2 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 83. HeapSort C´odigo 10 0 8 1 9 2 4 3 7 4 1 5 3 6 2 7 14 8 16 9 10 8 9 4 7 1 3 2 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 84. HeapSort C´odigo 2 0 8 1 9 2 4 3 7 4 1 5 3 6 10 7 14 8 16 9 2 8 9 4 7 1 3 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 85. HeapSort C´odigo 2 0 8 1 9 2 4 3 7 4 1 5 3 6 10 7 14 8 16 9 2 8 9 4 7 1 3 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 86. HeapSort C´odigo 9 0 8 1 3 2 4 3 7 4 1 5 2 6 10 7 14 8 16 9 9 8 3 4 7 1 2 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 87. HeapSort C´odigo 9 0 8 1 3 2 4 3 7 4 1 5 2 6 10 7 14 8 16 9 9 8 3 4 7 1 2 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 88. HeapSort C´odigo 2 0 8 1 3 2 4 3 7 4 1 5 9 6 10 7 14 8 16 9 2 8 3 4 7 1 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 89. HeapSort C´odigo 2 0 8 1 3 2 4 3 7 4 1 5 9 6 10 7 14 8 16 9 2 8 3 4 7 1 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 90. HeapSort C´odigo 8 0 7 1 3 2 4 3 2 4 1 5 9 6 10 7 14 8 16 9 8 7 3 4 2 1 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 91. HeapSort C´odigo 8 0 7 1 3 2 4 3 2 4 1 5 9 6 10 7 14 8 16 9 8 7 3 4 2 1 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 92. HeapSort C´odigo 1 0 7 1 3 2 4 3 2 4 8 5 9 6 10 7 14 8 16 9 1 7 3 4 2 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 93. HeapSort C´odigo 1 0 7 1 3 2 4 3 2 4 8 5 9 6 10 7 14 8 16 9 1 7 3 4 2 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 94. HeapSort C´odigo 7 0 4 1 3 2 1 3 2 4 8 5 9 6 10 7 14 8 16 9 7 4 3 1 2 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 95. HeapSort C´odigo 7 0 4 1 3 2 1 3 2 4 8 5 9 6 10 7 14 8 16 9 7 4 3 1 2 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 96. HeapSort C´odigo 2 0 4 1 3 2 1 3 7 4 8 5 9 6 10 7 14 8 16 9 2 4 3 1 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 97. HeapSort C´odigo 2 0 4 1 3 2 1 3 7 4 8 5 9 6 10 7 14 8 16 9 2 4 3 1 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 98. HeapSort C´odigo 4 0 2 1 3 2 1 3 7 4 8 5 9 6 10 7 14 8 16 9 4 2 3 1 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 99. HeapSort C´odigo 4 0 2 1 3 2 1 3 7 4 8 5 9 6 10 7 14 8 16 9 4 2 3 1 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 100. HeapSort C´odigo 1 0 2 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 1 2 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 101. HeapSort C´odigo 1 0 2 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 1 2 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 102. HeapSort C´odigo 3 0 2 1 1 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 3 2 1 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 103. HeapSort C´odigo 3 0 2 1 1 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 3 2 1 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 104. HeapSort C´odigo 1 0 2 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 1 2 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 105. HeapSort C´odigo 1 0 2 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 1 2 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 106. HeapSort C´odigo 2 0 1 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 2 1 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 107. HeapSort C´odigo 2 0 1 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 2 1 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 108. HeapSort C´odigo 1 0 2 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 1 2 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 109. HeapSort C´odigo 1 0 2 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 1 2 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 110. HeapSort C´odigo 1 0 2 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 1 2 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 111. HeapSort C´odigo 1 0 2 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 1 2 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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
  • 112. HeapSort C´odigo 1 0 2 1 3 2 4 3 7 4 8 5 9 6 10 7 14 8 16 9 1 2 3 4 7 8 9 10 14 16 0 1 2 3 4 5 6 7 8 9 i 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