Operações Básica
Seleção: Fornece o elemento de maior prioridadeComplexidades no pior caso
Inserção: Insere um elemento na lista
Remoção: Remove o elemento de maior prioridade
Alteração: Altera a prioridade de um elemento
Construção: Inserir todos os elementos a partir de uma estrutura vazia.
Implementação Seleção Inser. Rem. Alter. Constr. Lista Não Ordenada (DE) O(n) O(1) O(n) O(n) O(n) Lista Ordenada (Ordenação Total)
O(1) O(n) O(1) O(n) O(nlogn) Heap (Ordenação Parcial)
O(1) O(logn) O(logn) O(logn) O(n)
Um heap pode ser implementado utilizando-se um vetor, V, e
obedecendo-se a seguinte propriedade:
// Aumentando a prioridade de um elemento
void Subir(Filho) { Pai = piso( Filho / 2 ) if( Pai >= 1 ) { if( V[Filho] > V[Pai] ) { Troca V[Filho] e V[Pai] Subir(Pai) } } } |
// Diminuindo a prioridade de um elemento
void Descer(Pai,Total) { Filho = 2*Pai // Filho Esquerdo if( Filho <= Total) { if( Filho < Total) // Tem FilhoDir { if(V[Filho+1] > V[Filho]) ++Filho } if( V[Pai] < V[Filho]) { Trocar Pai e Filho Descer(Filho,Total) } } } |
void Inserir(chave)
{ V[n+1] = chave // n é a ultima posição do vetor ++n Subir(n) } |
void Remover()
{ V[1] = V[n] --n Descer(1,n) } |
Algorítmo I [ O(nlogn) ] | Algorítmo II [ O(n) ] |
for(i=2;i<=n;++i) Subir(i) | for(i=piso(n/2);i>=1;--i) Descer(i,n) |
Obs: Estou considerando o nível 1 (da raiz) como sendo o mais alto da árvore.
void HeapSort(V,n)
{
Construir Heap usando Algorítmo II
m = n
while( m > 1)
{
V[1] <=> V[m]
m = m - 1
Descer(1,m)
}
}