Você está na página 1de 47

Ordenao - HeapSort

Algoritmos e Estrutura de Dados I


Felipe Moreira Bernardes Marcelo Vincios Melo Martins Renato Alvilez Costa Wisley Jos Alves

Departamento de Cincias Exatas e Aplicadas Universidade Federal de Ouro Preto 2011-2

Ordenao - HeapSort

Filas de Prioridades
uma estrutura de dados onde a chave de cada item reete sua habilidade relativa de abandonar o conjunto de itens rapidamente. Aplicaes:
SOs usam las de prioridades, nas quais as chaves representam o tempo em que eventos devem ocorrer. Mtodos numricos iterativos so baseados na seleo repetida de um item com maior (menor) valor. Sistemas de gerncia de memria usam a tcnica de substituir a pgina menos utilizada na memria principal por uma nova pgina.
Ordenao - HeapSort

Tipos Abstratos de Dados


Operaes:
Constri uma la de prioridades a partir de um conjunto com n itens.

Ordenao - HeapSort

Tipos Abstratos de Dados


Operaes:
Constri uma la de prioridades a partir de um conjunto com n itens. Informa qual o maior item do conjunto.

Ordenao - HeapSort

Tipos Abstratos de Dados


Operaes:
Constri uma la de prioridades a partir de um conjunto com n itens. Informa qual o maior item do conjunto. Retira o item com maior chave.

Ordenao - HeapSort

Tipos Abstratos de Dados


Operaes:
Constri uma la de prioridades a partir de um conjunto com n itens. Informa qual o maior item do conjunto. Retira o item com maior chave. Insere um novo item.

Ordenao - HeapSort

Tipos Abstratos de Dados


Operaes:
Constri uma la de prioridades a partir de um conjunto com n itens. Informa qual o maior item do conjunto. Retira o item com maior chave. Insere um novo item. Aumenta o valor da chave do item i para um novo valor que maior que o valor atual da chave.

Ordenao - HeapSort

Tipos Abstratos de Dados


Operaes:
Constri uma la de prioridades a partir de um conjunto com n itens. Informa qual o maior item do conjunto. Retira o item com maior chave. Insere um novo item. Aumenta o valor da chave do item i para um novo valor que maior que o valor atual da chave. Substitui o maior item por um novo item, a no ser que o novo item seja maior.

Ordenao - HeapSort

Tipos Abstratos de Dados


Operaes:
Constri uma la de prioridades a partir de um conjunto com n itens. Informa qual o maior item do conjunto. Retira o item com maior chave. Insere um novo item. Aumenta o valor da chave do item i para um novo valor que maior que o valor atual da chave. Substitui o maior item por um novo item, a no ser que o novo item seja maior. Altera a prioridade de um item.

Ordenao - HeapSort

Tipos Abstratos de Dados


Operaes:
Constri uma la de prioridades a partir de um conjunto com n itens. Informa qual o maior item do conjunto. Retira o item com maior chave. Insere um novo item. Aumenta o valor da chave do item i para um novo valor que maior que o valor atual da chave. Substitui o maior item por um novo item, a no ser que o novo item seja maior. Altera a prioridade de um item. Remove um item qualquer.

Ordenao - HeapSort

Tipos Abstratos de Dados


Operaes:
Constri uma la de prioridades a partir de um conjunto com n itens. Informa qual o maior item do conjunto. Retira o item com maior chave. Insere um novo item. Aumenta o valor da chave do item i para um novo valor que maior que o valor atual da chave. Substitui o maior item por um novo item, a no ser que o novo item seja maior. Altera a prioridade de um item. Remove um item qualquer. Agrupar duas las de prioridades em uma nica.

Ordenao - HeapSort

Representao

Lista linear ordenada:


Constri O(n log n) ( ou O(n2 )).

Lista linear no ordenada:

Ordenao - HeapSort

Representao

Lista linear ordenada:


Constri O(n log n) ( ou O(n2 )). Insere O(n).

Lista linear no ordenada:

Ordenao - HeapSort

Representao

Lista linear ordenada:


Constri O(n log n) ( ou O(n2 )). Insere O(n). Retira O(1).

Lista linear no ordenada:

Ordenao - HeapSort

Representao

Lista linear ordenada:


Constri O(n log n) ( ou O(n2 )). Insere O(n). Retira O(1). Altera O(n).

Lista linear no ordenada:

Ordenao - HeapSort

Representao

Lista linear ordenada:


Constri O(n log n) ( ou O(n2 )). Insere O(n). Retira O(1). Altera O(n).

Lista linear no ordenada:


Constri O(n).

Ordenao - HeapSort

Representao

Lista linear ordenada:


Constri O(n log n) ( ou O(n2 )). Insere O(n). Retira O(1). Altera O(n).

Lista linear no ordenada:


Constri O(n). Insere O(1).

Ordenao - HeapSort

Representao

Lista linear ordenada:


Constri O(n log n) ( ou O(n2 )). Insere O(n). Retira O(1). Altera O(n).

Lista linear no ordenada:


Constri O(n). Insere O(1). Retira O(n).

Ordenao - HeapSort

Representao

Lista linear ordenada:


Constri O(n log n) ( ou O(n2 )). Insere O(n). Retira O(1). Altera O(n).

Lista linear no ordenada:


Constri O(n). Insere O(1). Retira O(n). Altera O(n)

Ordenao - HeapSort

Representao
A melhor representao atravs de uma estruturas de dados chamada heap:
Neste caso, Constri O(n). Insere, Retira, Substitui e Altera so O(log n).

Observao:
Para implementar a operao Agrupar de forma eciente e ainda preservar um custo logartmico para as operaes Insere, Retira, Substitui e Altera necessrio utilizar estruturas de dados mais sosticadas, tais como rvores binomiais (Vuillemin, 1978).

Ordenao - HeapSort

Filas de Prioridades

As operaes das las de prioridades podem ser utilizadas para implementar algoritmos de ordenao. Basta utilizar repetidamente a operao Insere para construir a la de prioridades. Em seguida, utilizar repetidamente a operao Retira para receber os itens na ordem reversa.

Ordenao - HeapSort

Usando Listas de Prioridades

O uso de listas lineares no ordenadas corresponde ao mtodo da seleo. O uso de listas lineares ordenadas corresponde ao mtodo da insero. O uso de heaps corresponde ao mtodo Heapsort.

Ordenao - HeapSort

Heaps

Funcionamento
Heap mximo(ordenao crescente) Heap mnimo(ordenao decrescente)

uma sequncia de itens com chaves c[1], c[2], ... , c[n], tal que:
c[i] >= c[2*i], c[i] >= c[2*i + 1],

para todo i = 1, 2, ...,

n 2

Ordenao - HeapSort

Heaps
A denio pode ser facilmente visualizada em uma rvore binria completa:

Ordenao - HeapSort

Heaps

rvore binria completa:


Os ns so numerados de 1 a n. O primeiro n chamado raiz. O n k 2 o pai do n k, para 1 < k <= n.

Os ns 2k e 2k + 1 so os lhos esquerda e direita do n k k, para 1 <= k <= . 2

Ordenao - HeapSort

Heaps
As chaves na rvore satisfazem a condio do heap. A chave em cada n maior do que as chaves em seus lhos. A chave no n raiz a maior chave do conjunto. Uma rvore binria completa pode ser representada por um array:

Ordenao - HeapSort

Heaps
A representao extremamente compacta. Permite caminhar pelos ns da rvore facilmente. Os lhos de um n i esto nas posies 2i e 2i + 1. O pai de um n i est na posio i (i div 2). 2

Na representao do heap em um arranjo, a maior chave est sempre na posio 1 do vetor. Os algoritmos para implementar as operaes sobre o heap operam ao longo de um dos caminhos da rvore. Um algoritmo elegante para construir o heap foi proposto por Floyd em 1964.
Ordenao - HeapSort

Heaps

O algoritmo no necessita de nenhuma memria auxiliar. Dado um vetor A[1], A[2], ..., A[n]. Os itens A k n +1 , A + 2 , ..., A[n] formam um heap: 2 2

Neste intervalo no existem dois ndices i e j tais que j = 2i ou j = 2i + 1.

Ordenao - HeapSort

Heaps
Algoritmo:

Ordenao - HeapSort

Heaps
Os itens de A[4] a A[7] formam a parte inferior da rvore binria associada, em que nenhuma relao de ordem necessria para formarem um heap. O heap estendido para a esquerda (Esq = 3), englobando o item A[3], pai dos itens A[6] e A[7]. A condio de heap violada:
O heap refeito trocando os itens D e S.

O item R incluindo no heap (Esq = 2), o que no viola a condio de heap. O item O incluindo no heap (Esq = 1). A Condio de heap violada:
O heap refeito trocando os itens O e S, encerrando o processo.
Ordenao - HeapSort

Heaps

O Programa que implementa a operao que informa o item com maior chave:
1 2 3 4

Item Max ( Item A ) { return (A [1]) ; }

Ordenao - HeapSort

Heaps

Programa para construir o heap:


1 2 3 4 5 6 7 8 9 10

v o i d Constroi ( Item A , i n t n ) { i n t Esq ; Esq = n / 2 ; w h i l e ( Esq > 0 ) { Refaz ( Esq , n , A ) ; Esq ; } }

Ordenao - HeapSort

Heaps
Programa para refazer a condio de heap:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

void Refaz ( i n t Esq , i n t Dir , Item A ) { i n t i = Esq , j ; Item aux ; j = i 2; aux = A [ i ] ; w h i l e ( j <= Dir ) { i f ( j < Dir ) { i f ( A [ j ] . Chave < A [ j + 1 ] . Chave ) j++; } i f ( aux . Chave >= A [ j ] . Chave ) break ; A[i] = A[j]; i = j; j = i 2 ; } A [ i ] = aux ; }

Ordenao - HeapSort

Heaps
Programa que implementa a operao de retirar o item com maior chave:
1 2 3 4 5 6 7 8 9 10 11 12 13

i n t RetiraMax ( Item A , i n t n , Item pMaximo ) { i f ( n < 1) return 0; else { pMaximo = A [ 1 ] ; A [ 1 ] = A [ n ] ; ( n ) ; Refaz ( 1 , n , A ) ; return 1; } }

Ordenao - HeapSort

Heaps
Programa que implementa a operao de aumentar o valor da chave do item i:
1 2 3 4 5 6 7 8 9 10 11 12 13

i n t AumentaChave ( i n t i , ChaveTipo ChaveNova , Item A ) { Item aux ; i f ( ChaveNova < A [ i ] . Chave ) return 0; A [ i ] . Chave = ChaveNova ; w h i l e ( i > 1 && A [ i / 2 ] . Chave < A [ i ] . Chave ) { aux = A [ i / 2 ] ; A [ i / 2 ] = A [ i ] ; A [ i ] = aux ; i /= 2 ; } return 1; }

Ordenao - HeapSort

Heaps
Heaps
Exemplo da operao de aumentar o valor da chave do item na posio i:

O tempo de execuo do procedimento AumentaChave em um item do heap O(log n).


Ordenao - HeapSort

Heaps

Programa que implementa a operao de inserir um novo item no heap:


1 2 3 4 5 6 7

v o i d Insere ( Item x , Item A , i n t n ) { ( n ) ++; A [ n ] = x ; A [ n ] . Chave = INT_MIN ; AumentaChave ( n , x>Chave , A ) ; }

Ordenao - HeapSort

Heapsort

Algoritmo:
Passo 1: Construir o heap.

Ordenao - HeapSort

Heapsort

Algoritmo:
Passo 1: Construir o heap. Passo 2: Troque o item na posio 1 do vetor (raiz do heap) com o item da posio n.

Ordenao - HeapSort

Heapsort

Algoritmo:
Passo 1: Construir o heap. Passo 2: Troque o item na posio 1 do vetor (raiz do heap) com o item da posio n. Passo 3: Use o procedimento Refaz para reconstituir o heap para os itens A[1], A[2], ..., A[n - 1].

Ordenao - HeapSort

Heapsort

Algoritmo:
Passo 1: Construir o heap. Passo 2: Troque o item na posio 1 do vetor (raiz do heap) com o item da posio n. Passo 3: Use o procedimento Refaz para reconstituir o heap para os itens A[1], A[2], ..., A[n - 1]. Passo 4: Repita os passos 2 e 3 com os n - 1 itens restantes, depois com os n - 2, at que reste apenas um item.

Ordenao - HeapSort

Heapsort
Exemplo de aplicao do Heapsort:

Ordenao - HeapSort

Heapsort

O caminho seguido pelo procedimento Refaz para reconstituir a condio do heap est em negrito. Por exemplo, aps a troca dos itens S e D na segunda linha da Figura, o item D volta para a posio 5, aps passar pelas posies 1 e 2.

Ordenao - HeapSort

Heapsort
Programa que mostra a implementao do Heapsort:
1 2 3 4 5 6 7 8 9 10 11 12 13 14

/ E n t r a a q u i a f u n c a o R e f a z / / E n t r a a q u i a f u n c a o C o n s t r o i / v o i d Heapsort ( Item A , Indice n ) { Indice Esq , Dir ; Item aux ; Constroi ( A , n ) ; / c o n s t r o i o heap / Esq = 1 ; Dir = n ; w h i l e ( Dir > 1 ) { / o r d e n a o v e t o r / aux = A [ 1 ] ; A [ 1 ] = A [ Dir ] ; A [ Dir ] = aux ; Dir ; Refaz ( Esq , Dir , A ) ; } }

Ordenao - HeapSort

Heapsort

Anlise
O procedimento Refaz gasta cerca de log n operaes, no pior caso. Constroi - executa O(n) x Refaz Loop interno - executa (n) x Refaz Logo, Heapsort gasta um tempo de execuo proporcional a n log n, no pior caso.

Ordenao - HeapSort

Heapsort
Vantagens:
O comportamento do Heapsort sempre O(nlogn), qualquer que seja a entrada.

Desvantagens:
O anel interno do algoritmo bastante complexo se comparado com o do Quicksort. O Heapsort no estvel.

Recomendado:
Para aplicaes que no podem tolerar eventualmente um caso desfavorvel. No recomendado para arquivos com poucos registros, por causa do tempo necessrio para construir o heap.
Ordenao - HeapSort

FIM

Crditos: Baseado nos livros Ziviani N. e Botelho, F.C. Projetos de Algoritmos com implementao em Java e C++, Editora Thomson, 2007. Tenenbaum, A.M., Langsam, Y. e Augenstein, M.J. Estruturas de Dados Usando C, Makron Books/Pearson Education, 1995.

Ordenao - HeapSort