Você está na página 1de 177

Unidade V:

Ordenação Interna - Heapsort

Instituto de Ciências Exatas e Informática


Departamento de Ciência da Computação
Heapsort

Agenda
• Definição de Heap

• Funcionamento básico

• Algoritmo em C#

• Análise dos número de comparações e movimentações

---------------------------- Algoritmos e Estruturas de Dados (2)


Heapsort

Introdução
• O Heapsort é um algoritmo de seleção que encontra o maior elemento
em uma lista, troca-o com o último e repete o processo

• Sua diferença em relação ao Algoritmo de Seleção é que o Heapsort utiliza


um Heap Invertido para selecionar o maior elemento de forma eficiente

• Neste momento, precisamos conhecer os conceitos de árvore e heap

---------------------------- Algoritmos e Estruturas de Dados (3)


Heapsort

Árvore
• Estrutura de dados cujas operações de inserção, remoção e substituição
possuem a mesma eficiência

• Estrutura de dados que contém um conjunto finito de vértices (nós) e outro


de arcos (arestas) que conectam os vértices

---------------------------- Algoritmos e Estruturas de Dados (4)


Heapsort

Árvore
• Estrutura de dados cujas operações de inserção, remoção e substituição
possuem a mesma eficiência

• Estrutura de dados que contém um conjunto finito de vértices (nós) e outro


de arcos (arestas) que conectam os vértices

O nó 5 é denominado nó raiz e
ele está no nível 0

---------------------------- Algoritmos e Estruturas de Dados (5)


Heapsort

Árvore
• Estrutura de dados cujas operações de inserção, remoção e substituição
possuem a mesma eficiência

• Estrutura de dados que contém um conjunto finito de vértices (nós) e outro


de arcos (arestas) que conectam os vértices

Os nós 3 e 7 são filhos do 5 e


esse é pai dos dois primeiros

---------------------------- Algoritmos e Estruturas de Dados (6)


Heapsort

Árvore
• Estrutura de dados cujas operações de inserção, remoção e substituição
possuem a mesma eficiência

• Estrutura de dados que contém um conjunto finito de vértices (nós) e outro


de arcos (arestas) que conectam os vértices

Um nó com filho(s) é chamado de


nó interno e outro sem, de folha

---------------------------- Algoritmos e Estruturas de Dados (7)


Heapsort

Árvore
• Estrutura de dados cujas operações de inserção, remoção e substituição
possuem a mesma eficiência

• Estrutura de dados que contém um conjunto finito de vértices (nós) e outro


de arcos (arestas) que conectam os vértices

Nosso exemplo é uma árvore


binária, pois cada nó tem no
máximo dois filhos

---------------------------- Algoritmos e Estruturas de Dados (8)


Heapsort

Heap
• Árvore binária em que cada nó é menor ou igual que seus filhos, fazendo
com que a raiz tenha o menor valor

• Suas folhas ocupam um ou dois níveis sendo que o penúltimo é completo e


as folhas do último nível se agrupam o mais à esquerda possível

2 3

4 5 6 7
1
8 9 5
0
---------------------------- Algoritmos e Estruturas de Dados (9)
Heapsort

Exercício Resolvido (1)


• Mostre um heap com os elementos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9

---------------------------- Algoritmos e Estruturas de Dados (10)


Heapsort

Exercício Resolvido (1)


• Mostre um heap com os elementos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9

---------------------------- Algoritmos e Estruturas de Dados (11)


Heapsort

Heap Invertido
• Árvore binária em que cada nó é maior ou igual que seus filhos, fazendo
com que a raiz tenha o maior valor

• Suas folhas ocupam um ou dois níveis sendo que o penúltimo é completo e


as folhas do último nível se agrupam o mais à esquerda possível

---------------------------- Algoritmos e Estruturas de Dados (12)


Heapsort

Exercício Resolvido (2)


• Mostre um heap invertido com os elementos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9

---------------------------- Algoritmos e Estruturas de Dados (13)


Heapsort

Exercício Resolvido (2)


• Mostre um heap invertido com os elementos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9

---------------------------- Algoritmos e Estruturas de Dados (14)


Heapsort

Consideração
• A partir deste ponto, neste material, a palavra heap será usada para
designar o heap invertido

---------------------------- Algoritmos e Estruturas de Dados (15)


Heapsort

Representação do Heap em um Array


• Como representar um heap usando um array?

• Afinal, estamos apresentando um algoritmo para ordenar arrays...

E agora José?

---------------------------- Algoritmos e Estruturas de Dados (16)


Heapsort

Exercício Resolvido (3)


• Represente o heap abaixo em um array

---------------------------- Algoritmos e Estruturas de Dados (17)


Heapsort

Exercício Resolvido (3)


• Represente o heap abaixo em um array

1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (18)
Heapsort

Exercício Resolvido (3)


• Represente o heap abaixo em um array COLA
● array[ 1 ] é a raiz
● array[ i / 2 ] é o pai de array[ i ], para i > 1
● Se array[2 * i] e array[2 * i + 1] existem, eles são
filhos de array[ i ]

16
1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (19)
Heapsort

Exercício Resolvido (3)


• Represente o heap abaixo em um array COLA
● array[ 1 ] é a raiz
● array[ i / 2 ] é o pai de array[ i ], para i > 1
● Se array[2 * i] e array[2 * i + 1] existem, eles são
filhos de array[ i ]

16 14 10
1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (20)
Heapsort

Exercício Resolvido (3)


• Represente o heap abaixo em um array COLA
● array[ 1 ] é a raiz
● array[ i / 2 ] é o pai de array[ i ], para i > 1
● Se array[2 * i] e array[2 * i + 1] existem, eles são
filhos de array[ i ]

16 14 10
1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (21)
Heapsort

Exercício Resolvido (3)


• Represente o heap abaixo em um array

16 14 10 13 11
1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (22)
Heapsort

Exercício Resolvido (3)


• Represente o heap abaixo em um array

16 14 10 13 11 8 9
1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (23)
Heapsort

Exercício Resolvido (3)


• Represente o heap abaixo em um array

16 14 10 13 11 8 9 7 1
1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (24)
Heapsort

Exercício Resolvido (3)


• Represente o heap abaixo em um array

16 14 10 13 11 8 9 7 1 5
1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (25)
Heapsort

Representação do Heap em um Array


• Podemos representar qualquer árvore binária em um array fazendo:

• array[ 1 ] é a raiz

• array[ i / 2 ] é o pai de array[ i ], para i > 1

• Se array[2 * i] e array[2 * i + 1] existem, eles são filhos de array[ i ]

• Se i é maior que (n / 2), array[ i ] é uma folha

---------------------------- Algoritmos e Estruturas de Dados (26)


Heapsort

Exercício Resolvido (4)


• Faça um método que recebe um número inteiro i e mostra na tela o
elemento localizado na posição i do heap e todos os ancestrais daquele
elemento. Por exemplo, dado o heap da página anterior, se seu método
receber o número 10, ele mostra na tela 5, 11, 14 e 16

16 14 10 13 11 8 9 7 1 5
1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (27)
Heapsort

Exercício Resolvido (4)


• Faça um método que recebe um número inteiro i e mostra na tela o
elemento localizado na posição i do heap e todos os ancestrais daquele
elemento. Por exemplo, dado o heap da página anterior, se seu método
receber o número 10, ele mostra na tela 5, 11, 14 e 16
void metodo(int i) {
for ( /**/; i >= 1; i /= 2){
System.out.println(array[i]);
}
}

16 14 10 13 11 8 9 7 1 5
1 2 3 4 5 6 7 8 9 10
---------------------------- Algoritmos e Estruturas de Dados (28)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31

9 8 3 7 6 1 2 5 4 0 31
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (29)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31

31

9 8 3 7 6 1 2 5 4 0 31
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (30)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

9 8 3 7 6 1 2 5 4 0 31
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (31)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}
true: 11 > 1 && array[11] > array[5]

9 8 3 7 6 1 2 5 4 0 31
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (32)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

9 8 3 7 31 1 2 5 4 0 6
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (33)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

9 8 3 7 31 1 2 5 4 0 6
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (34)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}
true: 5 > 1 && array[5] > array[2]

9 8 3 7 31 1 2 5 4 0 6
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (35)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

9 31 3 7 8 1 2 5 4 0 6
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (36)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

9 31 3 7 8 1 2 5 4 0 6
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (37)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}
true: 2 > 1 && array[2] > array[1]

9 31 3 7 8 1 2 5 4 0 6
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (38)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

31 9 3 7 8 1 2 5 4 0 6
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (39)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

31 9 3 7 8 1 2 5 4 0 6
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (40)
Heapsort

Exercício Resolvido (5)


• Sabendo que os k primeiros elementos de um array estão organizados no
formato de heap, faça um método que insira o (k+1)-ésimo elemento do
array no heap. Por exemplo, no array abaixo, temos que k é igual a 10 e o
elemento a ser inserido no heap é o 31
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}
false: 1 > 1 && ...

31 9 3 7 8 1 2 5 4 0 6
1 2 3 4 5 6 7 8 9 10 11
---------------------------- Algoritmos e Estruturas de Dados (41)
Heapsort

Operações Possíveis com um Heap


• Construção

• Inserção de um novo elemento

• Remoção do elemento com a maior chave

• Remoção de um elemento qualquer

• Unificar dois ou mais heaps

---------------------------- Algoritmos e Estruturas de Dados (42)


Heapsort

Exercício (1)
• Faça um método que receba dois heaps e retorne um terceiro heap
unificando as duas estruturas recebidas

---------------------------- Algoritmos e Estruturas de Dados (43)


Heapsort

Agenda
• Definição de Heap

• Funcionamento básico

• Algoritmo em C#

• Análise dos número de comparações e movimentações

---------------------------- Algoritmos e Estruturas de Dados (44)


Heapsort

Funcionamento Básico
• Construa o heap inserindo sistematicamente cada um dos elementos do
array

• Remova sistematicamente cada elemento do heap, reconstrua o heap e


insira o elemento removido na posição do array imediatamente seguinte ao
tamanho corrente do heap

• A seguir, veja os princípios de inserção e remoção no heap

---------------------------- Algoritmos e Estruturas de Dados (45)


Heapsort

Princípio de Inserção
• Crie uma nova folha (contendo o novo elemento) no último nível do heap.
Se esse estiver completo, recomece um novo nível

• Se o novo elemento for maior que seu pai, troque-os e realize o mesmo
processo para o pai, avô, bisavô e, assim, sucessivamente, até que todos
os pais sejam maiores que seus filhos

---------------------------- Algoritmos e Estruturas de Dados (46)


Heapsort

Exercício Resolvido (6)


• Inserir o 15 no heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (47)


Heapsort

Exercício Resolvido (6)


• Inserir o 15 no heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (48)


Heapsort

Exercício Resolvido (6)


• Inserir o 15 no heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (49)


Heapsort

Exercício Resolvido (6)


• Inserir o 15 no heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (50)


Heapsort

Exercício (2)
• Insira os números 11 e 9 na heap abaixo, respectivamente

---------------------------- Algoritmos e Estruturas de Dados (51)


Heapsort

Princípio de Remoção
• Armazene o elemento da raiz em uma variável temporária

• Substitua o elemento da raiz pelo da última folha do último nível

• Remova a última folha do último nível

• Troque o elemento da raiz com o de seu maior filho

• Repita o passo anterior para o filho com elemento trocado até que todos os
pais sejam maiores que seus filhos

---------------------------- Algoritmos e Estruturas de Dados (52)


Heapsort

Exercício Resolvido (7)


• Remova a raiz do heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (53)


Heapsort

Exercício Resolvido (7)


• Remova a raiz do heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (54)


Heapsort

Exercício Resolvido (7)


• Remova a raiz do heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (55)


Heapsort

Exercício Resolvido (7)


• Remova a raiz do heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (56)


Heapsort

Exercício Resolvido (7)


• Remova a raiz do heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (57)


Heapsort

Exercício Resolvido (7)


• Remova a raiz do heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (58)


Heapsort

Exercício Resolvido (7)


• Remova a raiz do heap abaixo

---------------------------- Algoritmos e Estruturas de Dados (59)


Heapsort

Exercício (3)
• Remova a raiz no heap abaixo. Em seguida, remova novamente a raiz

---------------------------- Algoritmos e Estruturas de Dados (60)


Heapsort

Agenda
• Definição de Heap

• Funcionamento básico

• Algoritmo em C#

• Análise dos número de comparações e movimentações

---------------------------- Algoritmos e Estruturas de Dados (61)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
}

//Ordenacao propriamente dita


int tam = n;
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
}
}
void construir(int tam){

}
...
void reconstruir(int tam){

}
...
---------------------------- Algoritmos e Estruturas de Dados (62)
Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
}
...
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

101 115 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (63)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
}
...
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

101 115 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (64)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
101
}
...
115
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

101 115 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (65)


Heapsort

Algoritmo em C#
void heapsort() {
true: 2 <= 6
//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
101
}
...
115
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

101 115 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (66)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
101
}
...
115
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

101 115 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (67)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
101
}
...
115
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}
i
101 115 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (68)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
101
}
...
115
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
} true: 2 > 1 && 115 > 101
i
101 115 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (69)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (70)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (71)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
} false: 1 > 1 && ...
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (72)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (73)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (74)


Heapsort

Algoritmo em C#
void heapsort() {
true: 3 <= 6
//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (75)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (76)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (77)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
} false: 3 > 1 && 30 > 115
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (78)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2);
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (79)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (80)


Heapsort

Algoritmo em C#
void heapsort() {
true: 4 <= 6
//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (81)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (82)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63
}
}
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (83)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63
}
} false: 4 > 1 && 63 > 101
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (84)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (85)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (86)


Heapsort

Algoritmo em C#
void heapsort() {
true: 5 <= 6
//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (87)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (88)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47
}
}
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (89)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47
}
} false: 5 > 1 && 47 > 101
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (90)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47
}
}
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (91)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47 20
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (92)


Heapsort

Algoritmo em C#
void heapsort() {
true: 6 <= 6
//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47 20
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (93)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47 20
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (94)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47 20
}
}
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (95)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47 20
}
} false: 6 > 1 && 20 > 30
i
115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (96)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47 20
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (97)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47 20
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (98)


Heapsort

Algoritmo em C#
void heapsort() {
false: 7 <= 6
//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47 20
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (99)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30
void construir(int tam){
for (int i = tam; i > 1 && array[i] > array[i/2]; i /= 2){
swap(i, i/2); 63 47 20
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (100)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}
...
101 30

63 47 20

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (101)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}

//Ordenacao propriamente dita 101 30


int tam = n;
while (tam > 1){
swap(1, tam--); 63 47 20
reconstruir(tam);
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (102)


Heapsort

Algoritmo em C#
void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
115
}

//Ordenacao propriamente dita 101 30


int tam = n;
while (tam > 1){
swap(1, tam--); 63 47 20
reconstruir(tam);
}
}

115 101 30 63 47 20
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (103)


Heapsort

Algoritmo em C#
int tam = n;
...
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
115
}
}
101 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 115 101 30 63 47 20
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (104)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 6
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
115
}
}
101 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 115 101 30 63 47 20
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (105)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 6
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
115
} true: 6 > 1
}
101 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 115 101 30 63 47 20
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (106)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
20
}
}
101 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 20 101 30 63 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (107)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
20
}
}
101 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 20 101 30 63 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (108)


Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 5 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
20
}
}
101 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 20 101 30 63 47 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (109)
Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 5 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
20
}
}
101 30
void reconstruir(int tam){
int i = 1; true: 1 <= 2
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 20 101 30 63 47 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (110)
Heapsort

Algoritmo em C#
...

tam
int tam = n; 5 i
while (tam > 1){
swap(1, tam--); filho 20
reconstruir(tam);
}
}
101 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 20 101 30 63 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (111)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5 i
while (tam > 1){
swap(1, tam--); filho 20
reconstruir(tam);
}
}
101 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 20 101 30 63 47 115
}
} 1 2 3 4 5 6
} true: 20 < 101

---------------------------- Algoritmos e Estruturas de Dados (112)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5 i
while (tam > 1){
swap(1, tam--); filho 101
reconstruir(tam);
}
}
20 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 101 20 30 63 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (113)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5 i
while (tam > 1){
swap(1, tam--); filho 101
reconstruir(tam);
}
}
20 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 101 20 30 63 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (114)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5 i
while (tam > 1){
swap(1, tam--); filho 101
reconstruir(tam);
}
}
20 30
void reconstruir(int tam){
int i = 1; true: 2 <= 2
== while
true (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 101 20 30 63 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (115)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5
while (tam > 1){
swap(1, tam--);
101
}
reconstruir(tam); i
}
filho 20 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 101 20 30 63 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (116)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5
while (tam > 1){
swap(1, tam--);
101
}
reconstruir(tam); i
}
filho 20 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 63 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 101 20 30 63 47 115
}
} 1 2 3 4 5 6
} true: 20 < 63

---------------------------- Algoritmos e Estruturas de Dados (117)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5
while (tam > 1){
swap(1, tam--);
101
}
reconstruir(tam); i
}
filho 63 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 101 63 30 20 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (118)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
101
} i
}
filho 63 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 101 63 30 20 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (119)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
101
} i
}
filho 63 30
void reconstruir(int tam){
int i = 1; false: 4 <= 2
while (hasFilho(i, tam) == true){ 20 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 101 63 30 20 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (120)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
101
}
}
63 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 101 63 30 20 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (121)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 5
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
101
} true: 5 > 1
}
63 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20 47
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 101 63 30 20 47 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (122)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
47
}
}
63 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 47 63 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (123)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
47
}
}
63 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 47 63 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (124)


Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 4 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
47
}
}
63 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 47 63 30 20 101 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (125)
Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 4 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
47
}
}
63 30
void reconstruir(int tam){
int i = 1; true: 1 <= 2
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 47 63 30 20 101 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (126)
Heapsort

Algoritmo em C#
...

tam
int tam = n; 4 i
while (tam > 1){
swap(1, tam--); filho 47
reconstruir(tam);
}
}
63 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 47 63 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (127)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4 i
while (tam > 1){
swap(1, tam--); filho 47
reconstruir(tam);
}
}
63 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 47 63 30 20 101 115
}
} 1 2 3 4 5 6
} true: 47 < 63

---------------------------- Algoritmos e Estruturas de Dados (128)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4 i
while (tam > 1){
swap(1, tam--); filho 63
reconstruir(tam);
}
}
47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (129)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4 i
while (tam > 1){
swap(1, tam--); filho 63
reconstruir(tam);
}
}
47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (130)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4 i
while (tam > 1){
swap(1, tam--); filho 63
reconstruir(tam);
}
}
47 30
void reconstruir(int tam){
int i = 1; true: 2 <= 2
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (131)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4
while (tam > 1){
swap(1, tam--);
63
}
reconstruir(tam); i
}
filho 47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (132)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4
while (tam > 1){
swap(1, tam--);
63
}
reconstruir(tam); i
}
filho 47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
} false: 47 < 20

---------------------------- Algoritmos e Estruturas de Dados (133)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4
while (tam > 1){
swap(1, tam--);
63
}
reconstruir(tam); i
}
filho 47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
} false: 47 < 20

---------------------------- Algoritmos e Estruturas de Dados (134)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
63
} i
}
filho 47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (135)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
63
} i
}
filho 47 30
void reconstruir(int tam){
int i = 1; false: 4 <= 2
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (136)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
63
}
}
47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (137)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 4
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
63
} true: 4 > 1
}
47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){ 20
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 63 47 30 20 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (138)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 3
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
20
}
}
47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 20 47 30 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (139)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 3
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
20
}
}
47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 20 47 30 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (140)


Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 3 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
20
}
}
47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 20 47 30 63 101 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (141)
Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 3 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
20
}
}
47 30
void reconstruir(int tam){
int i = 1; true: 1 <= 1
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 20 47 30 63 101 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (142)
Heapsort

Algoritmo em C#
...

tam
int tam = n; 3 i
while (tam > 1){
swap(1, tam--); filho 20
reconstruir(tam);
}
}
47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 20 47 30 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (143)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 3 i
while (tam > 1){
swap(1, tam--); filho 20
reconstruir(tam);
}
}
47 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 20 47 30 63 101 115
}
} 1 2 3 4 5 6
} true: 20 < 47

---------------------------- Algoritmos e Estruturas de Dados (144)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 3 i
while (tam > 1){
swap(1, tam--); filho 47
reconstruir(tam);
}
}
20 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 47 20 30 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (145)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 3 i
while (tam > 1){
swap(1, tam--); filho 47
reconstruir(tam);
}
}
20 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 47 20 30 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (146)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 3 i
while (tam > 1){
swap(1, tam--); filho 47
reconstruir(tam);
}
}
20 30
void reconstruir(int tam){
int i = 1; false: 2 <= 1
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 47 20 30 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (147)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 3
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
47
}
}
20 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 47 20 30 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (148)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 3
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
47
} true: 3 > 1
}
20 30
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 47 20 30 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (149)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 2
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
30
}
}
20
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (150)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 2
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
30
}
}
20
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (151)


Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 2 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
30
}
}
20
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (152)
Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 2 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
30
}
}
20
void reconstruir(int tam){
int i = 1; true: 1 <= 1
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (153)
Heapsort

Algoritmo em C#
...

tam
int tam = n; 2 i
while (tam > 1){
swap(1, tam--); filho 30
reconstruir(tam);
}
}
20
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (154)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 2 i
while (tam > 1){
swap(1, tam--); filho 30
reconstruir(tam);
}
}
20
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
} false: 30 < 20

---------------------------- Algoritmos e Estruturas de Dados (155)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 2 i
while (tam > 1){
swap(1, tam--); filho 30
reconstruir(tam);
}
}
20
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i filho
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
} false: 30 < 20

---------------------------- Algoritmos e Estruturas de Dados (156)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 2 i
while (tam > 1){
swap(1, tam--); filho 30
reconstruir(tam);
}
}
20
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (157)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 2 i
while (tam > 1){
swap(1, tam--); filho 30
reconstruir(tam);
}
}
20
void reconstruir(int tam){
int i = 1; false: 2 <= 1
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) { i
swap(i, filho);
i = filho;
filho
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (158)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 2
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
30
}
}
20
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (159)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 2
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
30
} true: 2 > 1
}
20
void reconstruir(int tam){
int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 30 20 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (160)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 1
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
20
}
}

void reconstruir(int tam){


int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 20 30 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (161)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 1
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
20
}
}

void reconstruir(int tam){


int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 20 30 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (162)


Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 1 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
20
}
}

void reconstruir(int tam){


int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 20 30 47 63 101 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (163)
Heapsort

Algoritmo em C#
... filho

tam
int tam = n; 1 i
while (tam > 1){ ?
swap(1, tam--);
reconstruir(tam);
20
}
}

void reconstruir(int tam){


int i = 1; false: 1 <= 0
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
i
} else {
i = tam; 20 30 47 63 101 115
}
} 1 2 3 4 5 6
} filho
?
---------------------------- Algoritmos e Estruturas de Dados (164)
Heapsort

Algoritmo em C#
...

tam
int tam = n; 1
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
20
}
}

void reconstruir(int tam){


int i = 1;
while (hasFilho(i, tam) == true){
int filho = getMaiorFilho(i, tam);
if (array[i] < array[filho]) {
swap(i, filho);
i = filho;
} else {
i = tam; 20 30 47 63 101 115
}
} 1 2 3 4 5 6
}

---------------------------- Algoritmos e Estruturas de Dados (165)


Heapsort

Algoritmo em C#
...

tam
int tam = n; 1
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
20
} false: 1 > 1
}

20 30 47 63 101 115
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (166)


Heapsort

Algoritmo em C#
int tam = n;
...
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
}
}

20 30 47 63 101 115
1 2 3 4 5 6

---------------------------- Algoritmos e Estruturas de Dados (167)


Heapsort

Exercício Resolvido (8)


• Implemente os métodos int getMaiorFilho(int i, int tam) e boolean
hasFilho(int i, int tam) apresentados anteriormentes

---------------------------- Algoritmos e Estruturas de Dados (168)


Heapsort

Exercício Resolvido (8)


• Implemente os métodos int getMaiorFilho(int i, int tam) e boolean
hasFilho(int i, int tam) apresentados anteriormentes

int getMaiorFilho(int i, int tam){


int filho;
if (2*i == tam || array[2*i] > array[2*i+ 1]) {
filho = 2*i;
} else {
filho = 2*i + 1;
}
tam

return filho; 2 4
i

---------------------------- Algoritmos e Estruturas de Dados (169)


Heapsort

Exercício Resolvido (8)


• Implemente os métodos int getMaiorFilho(int i, int tam) e boolean
hasFilho(int i, int tam) apresentados anteriormentes

int getMaiorFilho(int i, int tam){


i 63
int filho;
if (2*i == tam || array[2*i] > array[2*i+ 1]) {
filho = 2*i; 47 30
} else {
filho = 2*i + 1;
}
20
tam

return filho; 2 4
i

}
i
63 47 30 20 101 115
1 2 3 4 5 6
---------------------------- Algoritmos e Estruturas de Dados (170)
Heapsort

Exercício Resolvido (8)


• Implemente os métodos int getMaiorFilho(int i, int tam) e boolean
hasFilho(int i, int tam) apresentados anteriormentes

boolean hasFilho(int i, int tam){


return (i <= (tam/2));
}

---------------------------- Algoritmos e Estruturas de Dados (171)


Heapsort

Agenda
• Definição de Heap

• Funcionamento básico

• Algoritmo em C#

• Análise dos número de comparações e movimentações

---------------------------- Algoritmos e Estruturas de Dados (172)


Heapsort

Análise do Número de Comparações


• As operações de inserção e remoção podem percorrer um ramo completo
da árvore, com comparações e trocas em cada nó

• O pior caso para os números de comparações ou trocas depende da altura


da árvore que será (árvore balanceada)

• Assim, no pior caso, os números de comparações ou trocas serão 𝚯(lg(n))

---------------------------- Algoritmos e Estruturas de Dados (173)


Heapsort

Algoritmo em C#

void heapsort() {

//Contrução do heap
for (int tam = 2; tam <= n; tam++){
construir(tam);
}

//Ordenacao propriamente dita


int tam = n;
while (tam > 1){
swap(1, tam--);
reconstruir(tam);
}
}

---------------------------- Algoritmos e Estruturas de Dados (174)


Heapsort

Análise do Número de Comparações


• Criamos o heap com n inserções e efetuamos (n-1) remoções para ordenar
o array, assim, para todos os casos, temos:

n * 𝚯(lg(n)) + (n-1) * 𝚯(lg(n))

• Logo:

𝚯(n*lg(n))

---------------------------- Algoritmos e Estruturas de Dados (175)


Heapsort

Análise do Número de Movimentações


• O número de movimentações é três vezes o de trocas mais as (n-1)
movimentações correspondentes às remoções

• Como o número de trocas tem seu limite superior dado pelo de


comparações, a complexidade, no pior caso, é 𝚯(n*lg(n))

---------------------------- Algoritmos e Estruturas de Dados (176)


Heapsort

Exercício (4)
• Mostre todas as comparações e movimentações do algoritmo anterior para
o array abaixo:

---------------------------- Algoritmos e Estruturas de Dados (177)

Você também pode gostar