Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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
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.
Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia
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
Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia
17
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:
! ! 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
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!
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
Algoritmos e Estrutura de Dados Algoritmos de Ordenao: Heapsort 2011 Vinicius Cardoso Garcia
24