O algoritmo Heapsort organiza dados em uma estrutura de árvore binária chamada heap. Ele primeiro constrói um heap máximo a partir dos dados e então, repetidamente, move o maior elemento para o final do vetor e reconstrói o heap restante.
2. O algoritmo HEAPSORT é um algoritmo de ordenação
generalista, e faz parte da família de algoritmos
de ordenação por seleção. Foi desenvolvido em 1964 por
Robert W. Floyd e J.W.J Williams;
Foi desenvolvido com o objetivo de ser um
Ótimo ordenador de dados, tendo um consumo
De memoria bastante reduzido;
Organizando dados por meio de Árvore
Binaria ou HEAP.
Existem duas estruturas de HEAP a MAX-HEAP
e MIN-HEAP;
3. A definição MAX-HEAP é
utilizada quando no HEAP,
o nó pai é sempre maior
que qualquer um de seus
filhos;
Em contrapartida, MIN-
HEAP é utilizada quando
no HEAP, o nó pai é
sempre menor que
qualquer um de seus
filhos;
7
6 5
314 2
1
2 5
743 6
Raiz: “Primeiro” ponto da arvore;
Nó: Nó qualquer ponto;
Nó Pai: Qualquer nó que tem 1 ou mais nó Filhos;
Filhos: São as ramificações dos nós.
4. De que forma um HEAP é utilizado para realizar uma
operação de ordenação, se uma de suas características
é justamente não ordenar os valores dos seus nós ?
Já que MAX-HEAP e MIN-HEAP, localiza o maior e
menor valor respectivamente, logo, o mesmo é usado
parar organizar valores em crescente e decrescente.
Uma vez que o MAX-HEAP é atendido, sua raiz é
extraída, deixando de fazer parte da estrutura, e um
novo MAX-HEAP é feito utilizando os nós restantes;
5. QUAIS OS ÍNDICES?
9023 4 67 -8 54 21
S
E N
A I S P
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
0
Nó pai=(i)
Nó pai=(0)
23
6. QUAIS OS ÍNDICES?
9023 4 67 -8 54 21
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
Filho direito= 2*0+1
Filho direito= 1
Filho esquerdo= 2*0+2
Filho esquerdo= 2
23
E N
A I S P
0
4 67
1 2
7. QUAIS OS ÍNDICES?
9023 4 67 -8 54 21
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
Filho direito= 2*0+1
Filho direito= 1
Filho esquerdo= 2*0+2
Filho esquerdo= 2
23
E N
A I S P
0
4 67
1 2
8. 9023 4 67 -8 54 21
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
Nó pai=(i)
Nó pai=(1)
23
4 67
A I S P
0
1 2
9. 9023 4 67 -8 54 21
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
Filho direito= 2*1+1
Filho direito= 3
Filho esquerdo= 2*1+2
Filho esquerdo= 4
3 4
23
4 67
A I S P
0
1 2
-8 90
10. 9023 4 67 -8 54 21
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
Filho direito= 2*1+1
Filho direito= 3
Filho esquerdo= 2*1+2
Filho esquerdo= 4
3 4
23
4 67
A I S P
0
1 2
-8 90
11. 9023 4 67 -8 54 21
23
4 67
-8 90 S P
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
0
Nó pai=(i)
Nó pai=(2)
1
2
3 4
12. 9023 4 67 -8 54 21
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
Filho direito= 2*2+1
Filho direito= 5
Filho esquerdo= 2*2+2
Filho esquerdo= 6
23
4 67
-8 90 S P
0
1
2
3 4
54
5
21
6
13. 9023 4 67 -8 54 21
23
4 67
-8 90 54 21
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
0
Nó pai=(i)
Nó pai=(3)
1
2
3 4 5 6
14. 9023 4 67 -8 54 21
Nó Pai= (i);
Filho direito= 2i+1;
Filho esquerdo= 2i+2;
i 0 1 2 3 4 5 6
Filho direito= 2*3+1
Filho direito= 7
Filho esquerdo= 2*3+2
Filho esquerdo= 8
23
4 67
-8 90 S P
0
1
2
3 4
54
5
21
6
15. void heapsort(int *vet, int N){
int i, aux;
for(i=(N-1)/2; i>=0; i--){
criaHeap(vet, i, N-1);
}
for (i=N-1; i>=1; i--){
aux = vet[0];
vet[0]=vet[i];
vet[i]=aux;
criaHeap(vet, 0, i-1);
}
}
1º for: Cria a Hip a partir
dos dados no vetor.
222
2º for: Pega o maior
elemento da hip e coloca na
posição corresponde no
array.
Reconstrói a HIP
16. void heapsort(int *vet, int N){
int i, aux;
for(i=(N-1)/2; i>=0; i--){
criaHeap(vet, i, N-1);
}
for (i=N-1; i>=1; i--){
aux = vet[0];
vet[0]=vet[i];
vet[i]=aux;
criaHeap(vet, 0, i-1);
}
}
1º for: Cria a Hip a partir
dos dados no vetor.
222
2º for: Pega o maior
elemento da hip e coloca na
posição corresponde no
array.
Reconstrói a HIP
17. void heapsort(int *vet, int N){
int i, aux;
for(i=(N-1)/2; i>=0; i--){
criaHeap(vet, i, N-1);
}
for (i=N-1; i>=1; i--){
aux = vet[0];
vet[0]=vet[i];
vet[i]=aux;
criaHeap(vet, 0, i-1);
}
}
1º for: Cria a Hip a partir
dos dados no vetor.
IS E N A S P
i 0 1 2 3 4 5 6
i=(N-1)/2
i=(7-1)/2
i=3
i=(N-1)/2
Números de elementos.
Ponteiro do vetor.
18. void heapsort(int *vet, int N){
int i, aux;
for(i=(N-1)/2; i>=0; i--){
criaHeap(vet, i, N-1);
}
for (i=N-1; i>=1; i--){
aux = vet[0];
vet[0]=vet[i];
vet[i]=aux;
criaHeap(vet, 0, i-1);
}
}
1º for: Cria a Hip a partir
dos dados no vetor.
IS E N A S P
i 0 1 2 3 4 5 6
i=(N-1)/2
i=(7-1)/2
i=3
i=(N-1)/2
Números de elementos.
Ponteiro do vetor.
19. void heapsort(int *vet, int N){
int i, aux;
for(i=(N-1)/2; i>=0; i--){
criaHeap(vet, i, N-1);
}
for (i=N-1; i>=1; i--){
aux = vet[0];
vet[0]=vet[i];
vet[i]=aux;
criaHeap(vet, 0, i-1);
}
}
1º for: Cria a Hip a partir
dos dados no vetor.
222
2º for: Pega o maior
elemento da hip e coloca na
posição corresponde no
array.
Z Y X
Z
Y X
Pego o elemento que
esta no topo da HIP
E coloco numa
variável auxiliar
Z
aux
X
Coloco o valor de X no
inicio e copio o valor
de aux para o fim
Z
20. void heapsort(int *vet, int N){
int i, aux;
for(i=(N-1)/2; i>=0; i--){
criaHeap(vet, i, N-1);
}
for (i=N-1; i>=1; i--){
aux = vet[0];
vet[0]=vet[i];
vet[i]=aux;
criaHeap(vet, 0, i-1);
}
}
1º for: Cria a Hip a partir
dos dados no vetor.
222
2º for: Pega o maior
elemento da hip e coloca na
posição corresponde no
array.
Z Y X
Z
Y X
Pego o elemento que
esta no topo da HIP
E coloco numa
variável auxiliar
Z
aux
X
Coloco o valor de X no
inicio e copio o valor
de aux para o fim
Z
21. void heapsort(int *vet, int N){
int i, aux;
for(i=(N-1)/2; i>=0; i--){
criaHeap(vet, i, N-1);
}
for (i=N-1; i>=1; i--){
aux = vet[0];
vet[0]=vet[i];
vet[i]=aux;
criaHeap(vet, 0, i-1);
}
}
1º for: Cria a Hip a partir
dos dados no vetor.
222
2º for: Pega o maior
elemento da hip e coloca na
posição corresponde no
array.
Reconstrói a Heap
Esta Função é responsável por
chamar a função criaHeap, a qual
vamos ver a seguir.
22. void criarHeap(int *vet, int i, int f){
int aux = vet[i];
int j = i * 2 + 1;
while (j <= f){
if(j<f) {
if(vet[j] < vet[j+1]){
j=j+1;
}
}
if (aux < vet[j]){
vet[i] = vet[j];
i= j;
i= 2 * i + 1;
} else {
j= f + 1;
}
}
vet[i] = aux;
}
Vetor.
Inicio vetor.
Final vetor.
Valor AUX = primeira posição do
vetor (posição PAI).
Calculo de um dos
Filhos.
Verifica se esta dentro do vetor.
Filho é menor que final do vetor?
Qual dos filhos é maior ? Atribui
valor de J ao filho maior
Pai é menor que filho ?
Se sim, filho se torna pai(pois o
pai tem que ser maior que o filho)
E assim calcula o primeiro filho do
mesmo
Z
Y XX
W
X
23. void criarHeap(int *vet, int i, int f){
int aux = vet[i];
int j = i * 2 + 1;
while (j <= f){
if(j<f) {
if(vet[j] < vet[j+1]){
j=j+1;
}
}
if (aux < vet[j]){
vet[i] = vet[j];
i= j;
i= 2 * i + 1;
} else {
j= f + 1;
}
}
vet[i] = aux;
}
Vetor.
Inicio vetor.
Final vetor.
Valor AUX = primeira posição do
vetor (posição PAI).
Calculo de um dos
Filhos.
Verifica se esta dentro do vetor.
Filho é menor que final do vetor?
Qual dos filhos é maior ? Atribui
valor de J ao filho maior
Pai é menor que filho ?
Se sim, filho se torna pai(pois o
pai tem que ser maior que o filho)
E assim calcula o primeiro filho do
mesmo
Z
Y XX
W
X
24. void criarHeap(int *vet, int i, int f){
int aux = vet[i];
int j = i * 2 + 1;
while (j <= f){
if(j<f) {
if(vet[j] < vet[j+1]){
j=j+1;
}
}
if (aux < vet[j]){
vet[i] = vet[j];
i= j;
i= 2 * i + 1;
} else {
j= f + 1;
}
}
vet[i] = aux;
}
Vetor.
Inicio vetor.
Final vetor.
Valor AUX = primeira posição do
vetor (posição PAI).
Calculo de um dos
Filhos.
Verifica se esta dentro do vetor.
Filho é menor que final do vetor?
Qual dos filhos é maior ? Atribui
valor de J ao filho maior.
Pai é menor que filho ?
Se não, atribui um valor para J
maior que o vetor.
Antigo pai ocupa o lugar do
ultimo filho analisado.
X
Y XX
W
XZ
36. Heapsort é bastante utilizado para controlar filas de
prioridade. Podem ser filas de prioridades máximas ou
filas de prioridades mínimas:
Filas de prioridades máximas: Um exemplo e a fila de
trabalho em computadores compartilhados. Quando um
trabalho termina ou é interrompido, o trabalho de
prioridade mais alta é selecionado dentre os trabalhos
pendentes.
Filas de prioridades mínimas: Pode ser usado em um
simulador de eventos, cada qual com um tempo de ocorrência,
que serve como chaves. Os eventos devem ser simulados de
acordo com o evento de ocorrência, porque a simulação de um
evento pode provocar eventos futuros.
37. É recomendável para
aplicações que não podem
tolerar eventualmente um
caso desfavorável.
Para dados imprevisíveis,
pode ser mais vantajoso
por ser previsível em
termos de tempo de
execução.
O anel interno do algoritmo é
bastante complexo se comparado com
o do quickSort.
Não é estável.
Construir a árvore-heap pode
consumir muita memória.
Não é recomendado para arquivos
com poucos registros , por causa do
tempo necessário para construir o
heap.VANTAGENS
DESVANTAGENS
38. RECOMENDADO PARA
Não é recomendado para arquivos com
poucos registros, por causa do tempo
necessário para construir o heap.
Para aplicações que não podem tolerar
eventualmente um caso desfavorável.