Você está na página 1de 24

Algoritmos

de Ordenao: Heapsort
Centro de Inform-ca Universidade Federal de Pernambuco Sistemas de Informao Vinicius Cardoso Garcia vcg@cin.ufpe.br
2011 Vinicius Cardoso Garcia

Referncias
Notas de aula do prof. Tiago A. E. Ferreira (UFRPE) How to Think Like a Computer Scien-st
hSp://www.greenteapress.com/thinkpython/ thinkCSpy

Aprenda Computao com Python


hSp://www.franciscosouza.com.br/ aprendacompy/

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

Introduo
Problema
Dados N nmeros, arranj-los em ordem crescente ou decrescente

Ordenao (Sor-ng)
Ordenar dispor os elementos de um conjunto em uma ordem ascendente ou descendente

Mo-vao
O-mizao de alguns processos
Ex.: busca
Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

Exemplo

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

Premissas
Humanos fazem ordenao de forma eciente em muitos casos Humanos podem ver todos os jogadores de uma vez e rapidamente rearranjar os elementos de forma ad hoc Computadores conseguem apenas comparar dois elementos por vez

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

Algoritmos de Ordenao
Os algoritmos de ordenaoso aplicados para a organizao de listas de elementos quaisquer em ordem crescente ou decrescente Existem vrios algoritmos para este m:
Bubble Sort Insert Sort Merge Sort Heap Sort Quick Sort Etc...
Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

Algoritmo Heap Sort


O algoritmo Heap Sort u-liza o melhor dos algoritmos de ordenamento j estudados at agora:
Inserc0on Sort:
U-liza um ordenamento local

Merge Sort:
Apenas um nmero constante de elementos man-do fora do arranjo de entrada para ser ordenado (dividir para conquistar)

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

Algoritmo Heap Sort


O algoritmo Heap Sort u-liza uma estrutura de dados chamada Heap.
Um Heap um objeto arranjo que pode ser visto como uma rvore binria incompleta
Cada N corresponde a um elemento do arranjo

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

Estrutura Heap
O Arranjo representa o Heap
Este tem dois atributos:
Comprimento[A]: nmero de elementos do arranjo A Tamanho-do-Heap[A]: nmero de elementos do Heap arranjado dentro do arranjo A.

O arranjo A[1..comprimento[A]] pode ter vrios elementos


Porm, apenas os elementos at o ndice tamanho-do- heap[A] ( comprimento[A]) faro parte do heap

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

Estrutura Heap Estrutura Heap Estrutura Heap Estrutura Heap


O primeiro elemento do o arranjo nraizaiz ! O primeiro elemento do arranjo oo o r ! O primeiro elemento do arranjo o n nraiz ! O primeiro elemento d arranjo n raiz Para um n i,, possvel verificar: ! Para um n i possvel vericar: ! Para um n i,i, possvel verificar: ! Para um n possvel verificar:
O n Pai: " O n Pai: "" O n Pai: O n Pai:
" O n Filho Esquerdo: O n Filho Esquerdo: "" O n FilhoEsquerdo: O n Filho Esquerdo: " O n Filho Direito: "" O n FilhoDireito: O n Filho Direito: O n Filho Direito:
!Estas trs operaes, na grande maioria dos processadores ! ! Estastrs operaes, na grande maioria dos processadores Estas trs operaes, na grande maioria dos processadores

Estas trs operaes, na grande maioria dos podem ser executadas em uma nica instruo (custo em podem ser executadas em er executadas em u(custo em podem ser executadas em uma nica instruo (custo em processadores podem s uma nica instruo ma nica tempo constante) tempo constante) em tempo constante) tempo constante) instruo (custo
Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

10

Estrutura Heap
Existem dois -pos de heap binrios:
Heap mximo
Propriedade: para todo elemento diferente da raiz tem-se:
A[Parent[A]] A[i] Ou seja, o valor de um n no mximo o valor do seu pai (o maior elemento est na raiz)

Heap mnimo
Propridade: para todo elemento diferente da raiz tem- se:
A[Parent[A]] A[i] Ou seja, o valor de um n no mnimo o valor do seu pai (o menor elemento est na raiz)
Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

11

Estrutura Heap
Visualizando um Heap como uma rvore, possvel denir:
Altura de um n: nmero de arestas no caminho descendente simples mais longo do n at uma folha Altura do heap: a altura do n raiz Altura mxima: para um heap binrio de n elementos, a altura mxima ser (lgn) Custo em tempo: de forma geral, as operaes com o heap tero custo em tempo proporcionais a sua altura, logo T(n) = (lgn)
Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

12

Funo MAX-HEAPIFY
Executado em (lgn), a funo chave para a manuteno da propriedade do heap mximo Recebe: A Arranjo; i ndice. Supe: rvores com raizes leT[i] e right[i] so heaps mximos, mas A[i] no necessariamente. ObjeVvo: Flutuar A[i] para gran-r um heap mximo
Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

13

Funo MAX-HEAPIFY
def Parent(i): return i/2 def Lev(i): return 2*i def Right(i): return 2*i+1 def MaxHeapify(A, i, n): "Funcao q garante a manutencao do heap maximo" l = Lev(i) r = Right(i) if l <= n and A[l] > A[i]: largest = l else: largest = i if r <= n and A[r] > A[largest]: largest = r if largest != i: A[i], A[largest] = A[largest], A[i] MaxHeapify(A, largest, n)

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

14

Funo MAX-HEAPIFY
Suponha o n A[2]=4. Se chamarmos a funo MAX-HEAPIFY(A,2)

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

15

Funo MAX-HEAPIFY
No pior caso, o custo em tempo ir seguir a recorrncia:
T(n) = T(2n/3) + (1) Que segundo o teorema mestre, T(n) = (lgn)

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

16

Construindo um Heap Mximo


possvel u-lizar a funo MAX-HEAPIFY para construirmos um heap mximo
Dado um arranjo, A[1..n] possvel mostrar que A[(n/2 +1) .. n] sero todos folhas
Assim, todos estes elementos sero heaps de um elemento que podero ser u-lizados para comearmos a construir o heap mximo

Dada a funo BUILD-MAX-HEAP:

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

17

Exemplo: Construindo um Heap Mximo

def HeapLength(A): return len(A)-1 def BuildMaxHeap(A) "Funcao que constroi um heap maximo" n = HeapLength(A) for i in range(n/2,-1,-1): MaxHeapify(A,i,n)

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

18

Custos Custos
!! Um heap com n elemento ter altura lgn" " Um heap com n elemento ter altura ! !lgn" "

Custos

"Um heap com n elemento (exerccio) que para uma Porm, possvel mostrar ter altura lgn " Porm, possvel mostrar (exerccio) que para uma

altura b, existir no mximon/2b+1uma altura b, exis-r Porm, possvel mostrar q # para $ $ elementos altura b, existir no mximoue #n/2b+1elementos no mximo n/2b+1 elementos custo O(b) para uma " " A funo MAX-HEAPIFY ter um custo O(b) para uma A funo MAX-HEAPIFY ter um altura b MAX-HEAPIFY ter um custo O(b) para uma A funo altura b altura b " " Assim, o custo para a funo BUILD-MAX-HEAP ser: Assim, o custo para a funo BUILD-MAX-HEAP ser: Assim, o custo para a funo BUILD-MAX-HEAP ser:

! ! Mas, , , , llogo, Mas, Mas logo, ogo

! ! Assim possvel construir um heap mximo em tempo linear! Assim possvelonstruir um heap mximo em tempo linear! Assim possvel c construir um heap mximo em tempo linear!

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

19

Algoritmo HeapSort
Algoritmo HeapSort
!

Dado um arranjo A[1..n] crido um heap Dado um arranjo A[1..n] criado um heap mximo. mximo.
Como o maior elemento est da raiz (A[1]), troca-se este " Como o maior elemento est da raiz (A[1]), troca-se elemento como o l-mo elemento do arranjo (A[n]) , este elemento como o ltimo elemento do arranjo diminuindo-se o tamanho do heap de 1. (A[n]) , diminuindo-se o tamanho do heap de 1. O com o novo arranjo A[1..(n-1)] refaz-se o mesmo " O com o novo arranjo A[1..(n-1)] refaz-se o mesmo procedimento. procedimento.

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

20

Algoritmo HeapSort (Python)


def HeapSort(A): # use a heap to build sorted array from the end "Algoritmo de ordenamento HeapSort" BuildMaxHeap(A) HeapSize=HeapLength(A) for i in range(HeapSize,0,-1): A[0],A[i]=A[i],A[0] # largest element is a root of heap, put it at the end of array HeapSize=HeapSize-1 # shrink heap size by 1 to get next largest element MaxHeapify(A,0,HeapSize) return A

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

21

Custo do HeapSort
Cada chamada da funo BUILD-MAX-HEAP tem custo O(n).
Esta funo chamada 1 vezes!

Cada chamada da funo MAX-HEAPIFY tem custo O(lgn)


Esta funo chamda (n-1) vezes!

O custo total do algoritmo HeapSort ser:


O(nlgn)

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

22

Exemplo

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

23

AVvidades complementares
Implemente o HeapSort em Python OO
E em Java

Leitura dos Captulo 6 do livro do Cormen e Resolva as seguintes questes:


6.1-2 6.1-7 6.3-3

Hints for implemen-ng HeapSort & Priority Queues in Python


hSps://eee.uci.edu/01f/15545/heap-hint.html

Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia

24

Você também pode gostar