Você está na página 1de 109

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Algoritmos de Ordenao na
Memria Principal
Antonio Alfredo Ferreira Loureiro
loureiro@dcc.ufmg.br
http://www.dcc.ufmg.br/~loureiro

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Consideraes iniciais
Objetivos:
Apresentar os mtodos de ordenao mais importantes sob o ponto de
vista prtico
Mostrar um conjunto amplo de algoritmos para realizar uma mesma tarefa,
cada um deles com uma vantagem particular sobre os outros, dependendo
da aplicao
Cada mtodo:
ilustra o uso de estruturas de dados
mostra como a escolha da estrutura influi nos algoritmos

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Definio e objetivos da ordenao


Ordenar corresponde ao processo de rearranjar um conjunto de objetos em
uma ordem especfica.
Objetivo da ordenao:
facilitar a recuperao posterior de elementos do conjunto ordenado.
Exemplos:
Listas telefnicas
Dicionrios
ndices de livros
Tabelas e arquivos

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Observaes
Os algoritmos trabalham sobre os registros de um arquivo.
Apenas uma parte do registro, chamada chave, utilizada para controlar a
ordenao.
Alm da chave podem existir outros componentes em um registro, que no
tm influncia no processo de ordenar, a no ser pelo fato de que permanecem com a mesma chave.
O tamanho dos outros componentes pode influenciar na escolha do mtodo
ou na forma de implementao de um dado mtodo.
A estrutura de dados registro a indicada para representar os elementos a
serem ordenados.

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Notao
Sejam os os itens a1, a2, . . . , an.
Ordenar consiste em permutar estes itens em uma ordem
a k1 , a k2 , . . . , a kn
tal que, dada uma funo de ordenao f , tem-se a seguinte relao:
f (ak1 ) f (ak2 ) . . . f (akn )
Funo de ordenao definida sobre o campo chave.

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Notao
Qualquer tipo de campo chave, sobre o qual exista uma relao de ordem
total <, para uma dada funo de ordenao, pode ser utilizado.
A relao < deve satisfazer as condies:
Apenas um de a < b, a = b, a > b verdade
Se a < b e b < c ento a < c
A estrutura registro indicada para representar os itens ai.
type ChaveTipo = integer;
type Item
= record
Chave : ChaveTipo;
{outros componentes}
end;

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Observaes
A escolha do tipo da chave como inteiro arbitrria.
Qualquer tipo sobre o qual exista uma regra de ordenao bem definida pode
ser utilizado.
Tipos usuais so o inteiro e seqncia de caracteres.
Outros componentes representam dados relevantes sobre o item.
Um mtodo de ordenao dito estvel, se a ordem relativa dos itens com
chaves iguais mantm-se inalterada pelo processo de ordenao.
Exemplo:
Se uma lista alfabtica de nomes de funcionrios de uma empresa ordenada pelo campo salrio, ento um mtodo estvel produz uma lista em
que os funcionrios com mesmo salrio aparecem em ordem alfabtica.

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Classificao dos mtodos de ordenao:


Ordenao interna
Nmero de registros a serem ordenados pequeno o bastante para que todo
o processo se desenvolva na memria interna (principal)
Qualquer registro pode ser acessado em tempo O(1)
Organiza os dados na forma de vetores, onde cada dado visvel
Exemplo:
12 7 10 5

4 15 9

8 ...

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Ordenao interna
Requisito predominante:
Uso econmico da memria disponvel.
Logo, permutao dos itens in situ.
Outro requisito importante:
Economia do tempo de execuo.
Medidas de complexidade relevantes:
C(n): nmero de comparaes entre chaves
M (n): nmero de movimentos ou trocas de registros
Observao:
A quantidade extra de memria auxiliar utilizada pelo algoritmo tambm
um aspecto importante.
Os mtodos que utilizam a estrutura vetor e que executam a permutao
dos itens no prprio vetor, exceto para a utilizao de uma pequena tabela
ou pilha, so os preferidos.

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Classificao dos mtodos de ordenao:


Ordenao externa
Nmero de registros a ser ordenado maior do que o nmero que cabe na
memria interna.
Registros so armazenados em um arquivo em disco ou fita.
Registros so acessados seqencialmente ou em grandes blocos.
Apenas o dado de cima visvel.
Exemplo:
!P
PP
PP
!!
!
!
!
!
!
!
!
!
!
!
!!
!
!
!
!
!
!
!
!
!
!
PP
!
!
!
!
!
P
!
!
!
!
!
!
P
!
P
!
!
P
!
!
!
!
P
!
P
!
!
P
!
!
P
!
!
P!
P
!
P
!
!
P
!
!
P
!
!
P!
P
!
P
!
!
P
!
!
P
!
!
P!
P
!
P
!
P
!
P
!
!
P!
P
!
P
!
P
!
P
!
P!
P
!
P
!
P
!
P
!
P!
P
!
P
P
!
P
!
P!
PP
!
P
P!
!
PP
P
!!
P!
PP
P
P!
P
P!!

!P
PP
PP
!!
!
!
!
!
!
!
!
!
!
!!
!
!
!
!
!
!
!
!
!
!
!
P
!
!
!
!
!
P
!
PP
!
!
!
!
P
!
P
!
!
!
!
!
!!
P
!
P
!
!
P
!
!
P
!
P!
P
!
P
!!
!
P
!
!
P
!
!
P!
P
!
P
!
!
P
!
!
P
!
!
P!
P
!
P
!
P
!
P
!
!
P!
P
P
!
!
P!
P
!
PP
!
PP
!!
P
!!
P!
P
!
P
P
P!!
PP
!!
P
!
P
P!
!
PP
P
!
P!
PP
!
P
P!
P
P!

!P
PP
PP
!!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
PP
!
!
!
!
!
P
!
!
!
!
!
!
P
!
P
!
!
P
!
!
!
!
P
!
P
!
!
P
!
!
P
!
!
P!
P
!
P
!
!
P
!
!
P
!
!
P!
P
!
P
!
!
P
!
!
P
!
!
P!
P
!
P
!
P
!
P
!
!
P!
P
!
P
!
P
!
P
!
P!
P
!
P
!
P
!
P
!
P!
P
!
P
P
!
P
!
P!
PP
!
P
P!
!
PP
P
!!
P!
PP
P
P!
P
P!!

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Mtodos para ordenao interna


Mtodos Simples ou Diretos:
Programas so pequenos e fceis de entender.
Ilustram com simplicidade os princpios de ordenao.
Complexidade: C(n) = O(n2)
Mtodos Eficientes:
Requerem menos comparaes
So mais complexos nos detalhes
Complexidade: C(n) = O(n log n)

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Algumas regras para aplicao dos mtodos


Mtodo simples:
Pequena quantidade de dados
Algoritmo executado apenas uma vez ou algumas vezes
Mtodo eficiente:
Quantidade maior de dados
Algoritmo executado vrias vezes
Eventualmente, pode ser necessria uma combinao dos dois mtodos no
caso de uma implementao eficiente

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Tipos utilizados na implementao dos algoritmos


Na implementao dos algoritmos usaremos:
type ndice = 0..N;
Item
= record
Chave : integer;
{outros componentes}
end;
Vetor = array [ndice] of Item;
var A : Vetor;
O tipo Vetor do tipo estruturado arranjo, composto por uma repetio do tipo
de dados Item.
O ndice do vetor vai de 0 at n, para poder armazenar chaves especiais
chamadas sentinelas.

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Mtodos de ordenao tratados no curso


Mtodos simples:
Ordenao por seleo
Ordenao por insero
Ordenao por permutao (Mtodo da Bolha)
Mtodos eficientes:
Ordenao por insero atravs de incrementos decrescentes (Shellsort)
Ordenao de rvores (Heapsort)
Ordenao por particionamento (Mergesort e Quicksort)

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Mtodos de ordenao que utilizam o princpio de


distribuio
Mtodos que no fazem ordenao baseados em comparao de chaves.
Exemplo:
Considere o problema de ordenar um baralho com 52 cartas no ordenadas.
Suponha que ordenar o baralho implica em colocar as cartas de acordo
com a ordem
A < 2 < 3 < . . . < 10 < J < Q < K
<<<

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Mtodos de ordenao que utilizam o princpio de


distribuio
Para ordenar por distribuio, basta seguir os passos abaixo:
1. Distribuir as cartas abertas em 13 montes, colocando em cada monte todos os ases, todos os dois, todos os trs, . . . , todos os reis.
2. Colete os montes na ordem acima (s no fundo, depois os dois, etc), at
o rei ficar no topo.
3. Distribua novamente as cartas abertas em 4 montes, colocando em cada
monte todas as cartas de paus, todas as cartas de ouros, todas as cartas
de copas e todas as cartas de espadas.
4. Colete os montes na ordem indicada acima (paus, ouros, copas e espadas).

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Mtodos de ordenao que utilizam o princpio de


distribuio
Mtodos baseados no princpio de distribuio so tambm conhecidos como
ordenao digital, radixsort ou bucketsort.
Exemplos:
Classificadoras de cartes perfurados utilizam o princpio da distribuio
para ordenar uma massa de cartes.
Carteiro no momento de distribuir as correspondncias por rua ou bairro
Dificuldades de implementar este mtodo:
Est relacionada com o problema de lidar com cada monte.
Se para cada monte reservada uma rea, ento a demanda por memria
extra pode se tornar proibitiva.
O custo para ordenar um arquivo com n elementos da ordem de O(n), pois
cada elemento manipulado algumas vezes.

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Ordenao por Seleo


Um dos algoritmos mais simples
Princpio:
1. Seleciona o item com a menor chave
2. Troca este item com o item A[1]
3. Repita a operao com os n 1 itens restantes, depois com os n 2
restantes, etc.
Exemplo (chaves sublinhadas foram trocadas de posio):
Chaves iniciais
i=1
i=2
i=3
i=4
i=5

44
12
12
12
12
12

12
44
18
18
18
18

55
55
55
42
42
42

42
42
42
55
44
44

94
94
94
94
94
55

18
18
44
44
55
94

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Algoritmo Seleo
procedure Selecao(var A : Vetor);
var i, j, Min : Indice;
T
: Item;
begin
for i:=1 to n-1 do
begin
Min := i;
for j:=i+1 to n do
if A[j].Chave < A[Min].Chave
then Min := j;
T := A[Min];
A[Min] := A[i];
A[i] := T;
end;
end; {Selecao}

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Anlise do algoritmo Seleo


O comando de atribuio Min := j
executado em mdia cerca de n log n vezes (Knuth, D.E., 1973)
Este valor depende do nmero de vezes que cj menor do que todas as
chaves anteriores c1, c2, . . . , cj1, quando estamos percorrendo as chaves c1, c2, . . . , cn
Anlise:
2
n
2)
C(n) = 2 n
=
O(n
2
M (n) = 3(n 1) = O(n)
C(n) e M (n) independem da ordem inicial das chaves

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Observaes sobre o algoritmo de Seleo


um dos mtodos mais simples de ordenao existentes
Para arquivos com registros muito grandes e chaves pequenas, este deve ser
o mtodo a ser utilizado
Com chaves do tamanho de uma palavra, este mtodo torna-se bastante interessante para arquivos pequenos
O fato do arquivo j estar ordenado no ajuda em nada pois o custo continua
quadrtico
O algoritmo no estvel, pois ele nem sempre deixa os registros com chaves
iguais na mesma posio relativa

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Ordenao por Insero


Mtodo preferido dos jogadores de cartas
Princpio:
Em cada passo, a partir de i = 2, o i-simo elemento da seqncia fonte
apanhado e transferido para a seqncia destino, sendo inserido no seu
lugar apropriado
Observao: caractersticas opostas ordenao por seleo

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Ordenao por Insero


Exemplo:
Chaves iniciais
i=2
i=3
i=4
i=5
i=6

44
12
12
12
12
12

12
44
44
42
42
18

55
55
55
44
44
42

42
42
42
55
55
44

94
94
94
94
94
55

18
18
18
18
18
94

As chaves em negrito representam a seqncia destino

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Ordenao por Insero


A colocao do item no seu lugar apropriado na seqncia destino realizada
movendo-se itens com chaves maiores para a direita e ento inserindo o item
na posio deixada vazia
Neste processo de alternar comparaes e movimentos de registros existem
duas condies distintas que podem causar a terminao do processo:
Um item com chave menor que o item em considerao encontrado
O final da seqncia destino atingido esquerda
A melhor soluo para a situao de um anel com duas condies de terminao a utilizao de um registro sentinela:
Na posio zero do vetor colocamos o prprio registro em considerao
Para isso, o ndice do vetor tem que ser definido para a seqncia 0..n

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Algoritmo de Insero
procedure Insercao(var A : Vetor);
var i, j : Indice;
T
: Item;
begin
for i:=2 to n do
begin
T := A[i];
j := i-1;
A[0] := T; {sentinela esquerda}
while T.Chave < A[j].Chave do
begin
A[j+1] := A[j];
j := j - 1;
end;
A[j+1] := T;
end;
end; {Insercao}

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Anlise de Insero: Comparaes


Anel mais interno (while): i-simo deslocamento:
Melhor caso: Ci = 1
Pior caso:

Ci = i

Caso mdio:

Pi
i+1
1
Ci = i j=1 j = 1i ( i(i+1)
)
=
2
2

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Anlise de Insero: Comparaes


Consideraes:
Pn
C(n) = i=2 Ci
Vamos assumir que para o caso mdio todas as permutaes de n so
igualmente provveis
Cada caso dado por:
Melhor caso:
Pior caso:
Caso mdio:

Pn
i=2 1 = n 1
Pn
Pn
n(n+1)
n2 + n 1
i
=
i

1
=

1
=
i=2
i=1
2
2
2
Pi
i+1
1 ( n(n+1) 1 + n 1) = n2 + 3n 1
=
i=2 2
2
2
4
4

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Anlise de Insero: Movimentaes


O nmero de movimentaes na i-sima iterao :
Mi = Ci 1 + 3 = Ci + 2 (incluindo a sentinela)
Pn
i=2 Mi, onde cada caso dado por:
Pn
Pn
Melhor caso:
(1
+
2)
=
i=2
i=2 3 = 3(n 1) = 3n 3

Temos que M (n) =

Pior caso:

Caso mdio:

Pn
Pn
Pn
(i
+
2)
=
i
+
i=2
i=2
i=2 2 =
n(n+1)
n(n+1)
n2 + 5n 3

1
+
2(n

1)
=
+
2n

3
=
2
2
2
2
Pi
Pn
Pn
i+1
i+1
n2 + 11n 1
+
2)
=
+
2
=
(
i=2 2
i=2 2
i=2
4
4

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Insero: Pior caso


0
i=2
i=3
i=4
i=5
i=6

5
4
3
2
1

1
6
5
4
3
2
2

2
5
6
5
4
3
3

3
4
4
6
5
4
4

4
3
3
3
6
5
5

5
2
2
2
2
6
6

6
1
1
1
1
1
1

# de comp.
2
3
4
5
6
20 (total)

n2
n
36
6
C(n) =
+ 1=
+ 1 = 18 + 3 1 = 20
2
2
2
2
5n
36
30
n2
+
3=
+
3 = 18 + 15 3 = 30
M (n) =
2
2
2
2

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Observaes sobre o algoritmo de Insero


O nmero mnimo de comparaes e movimentos ocorre quando os itens
esto originalmente em ordem
O nmero mximo ocorre quando os itens esto originalmente na ordem reversa, o que indica um comportamento natural para o algoritmo
Para arquivos j ordenados o algoritmo descobre, a um custo O(n), que cada
item j est no seu lugar
Utilizao:
O mtodo de insero o mtodo a ser utilizado quando o arquivo est
quase ordenado
tambm um bom mtodo quando se deseja adicionar poucos itens a um
arquivo j ordenado e depois obter um outro arquivo ordenado, com custo
linear
O mtodo estvel pois deixa os registros com chaves iguais na mesma
posio relativa

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Insero Seleo
Arquivos j ordenados:
Insero: algoritmo descobre imediatamente que cada item j est no seu
lugar (custo linear)
Seleo: ordem no arquivo no ajuda (custo quadrtico)
Adicionar alguns itens a um arquivo j ordenado:
Mtodo da insero o mtodo a ser usado em arquivos quase ordenados

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Insero Seleo
Comparaes:
Insero tem um nmero mdio de comparaes que aproximadamente
a metade da Seleo
Movimentaes:
Seleo tem um nmero mdio de comparaes que cresce linearmente
com n, enquanto que a mdia de movimentaes na Insero cresce com
o quadrado de n

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Comentrios sobre movimentaes de registros


Para registros grandes com chaves pequenas, o grande nmero de movimentaes na Insero bastante prejudicado
No outro extremo, registros contendo apenas a chave, temos como objetivo
reduzir o nmero de comparaes, principalmente se a chave for grande
Nos dois casos, o tempo da ordem de n2, para n suficientemente grande
Uma forma intuitiva de diminuir o nmero mdio de comparaes na Insero
adotar uma pesquisa binria na parte j ordenada do arquivo
Isto faz com que o nmero mdio de comparaes em um sub-arquivo de
k posies seja da ordem de log2 k, que uma reduo considervel
Isto resolve apenas metade do problema, pois a pesquisa binria s diminui
o nmero de comparaes, j que uma insero continua com o mesmo
custo

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Mtodo da Bolha
Princpio:
Chaves na posio 1 e 2 so comparadas e trocadas se estiverem fora de
ordem
Processo repetido com as chaves 2 e 3, at n 1 e n
Se desenharmos o vetor de armazenamento verticalmente, com A[n] em cima e A[1] embaixo, durante um passo do algoritmo, cada registro sobe at
encontrar outro com chave maior, que por sua vez sobe at encontrar outro
maior ainda, etc, com um movimento semelhante a uma bolha subindo em
um tubo de ensaio
A cada passo, podemos limitar o procedimento posio do vetor que vai de
1 at a posio onde ocorreu a ltima troca no passo anterior

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Algoritmo da Bolha (Bubblesort)


var
Lsup, Bolha, j : integer;
Aux
: Clula
begin
Lsup := n;
repeat
Bolha := 0;
for j := 1 to Lsup - 1 do
if A[j].Chave > A[j+1].Chave
then begin
Aux
:= A[j];
A[j]
:= A[j+1];
A[j+1] := Aux;
Bolha := j;
end:
Lsup := Bolha
until Lsup <= 1
end;

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Exemplo do algoritmo da Bolha

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
Lsup
Passos

14
4
15
0
2
10
3
12
6
8
13
11
7
1
5
9

15
14
4
13
0
2
10
3
12
6
8
11
9
7
1
5
15
1

15
14
13
4
12
0
2
10
3
11
6
8
9
7
5
1
13
2

15
14
13
12
4
11
0
2
10
3
9
6
8
7
5
1
12
3

15
14
13
12
11
4
10
0
2
9
3
8
6
7
5
1
11
4

15
14
13
12
11
10
4
9
0
2
8
3
7
6
5
1
10
5

15
14
13
12
11
10
9
4
8
0
2
7
3
6
5
1
9
6

15
14
13
12
11
10
9
8
4
7
0
2
6
3
5
1
8
7

15
14
13
12
11
10
9
8
7
4
6
0
2
5
3
1
7
8

15
14
13
12
11
10
9
8
7
6
4
5
0
2
3
1
6
9

15
14
13
12
11
10
9
8
7
6
5
4
3
0
2
1
5
10

15
14
13
12
11
10
9
8
7
6
5
4
3
2
0
1
2
11

15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
12

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Comentrios sobre o mtodo da Bolha


Parece com o algoritmo de Seleo
Este mtodo faz tantas trocas que o tornam o mais ineficiente de todos os
mtodos Simples ou Diretos
Melhor caso:
Ocorre quando o arquivo est completamente ordenado, fazendo n 1
comparaes e nenhuma troca, em apenas um passo
Pior caso:
Ocorre quando o arquivo est em ordem reversa, ou seja, quando o ksimo passo faz n k comparaes e trocas, sendo necessrio n 1
passos
Quanto mais ordenado estiver o arquivo melhor a atuao do mtodo
No entanto, um arquivo completamente ordenado, com exceo da menor
Chave que est na ltima posio far o mesmo nmero de comparaes
do pior caso

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Anlise do caso mdio


Comparaes:
n2 3n
C(n) =

2
4
Movimentos:
3n2 3n
M (n) =

4
4

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Comentrios sobre o mtodo da Bolha


Mtodo lento:
S compara posies adjacentes
Cada passo aproveita muito pouco do que foi aprendidosobre o arquivo no
passo anterior
Comparaes redundantes em excesso, devido linearidade dos algoritmos,
e a uma seqncia fixa de comparaes

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Shellsort
O mtodo da insero troca itens adjacentes quando est procurando o ponto
de insero na seqncia destino
No primeiro passo se o menor item estiver mais direita no vetor so necessrias n 1 comparaes para achar o seu ponto de insero
Shellsort permite troca de itens distantes uns dos outros
Uma extenso do algoritmo de ordenao por insero
Shellsort contorna este problema permitindo trocas de registros que esto
distantes um do outro
Itens que esto separados h posies so rearranjados de tal forma que
todo h-simo item leva a uma seqncia ordenada
Ordenao por insero atravs de incrementos decrescentes

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Shellsort
Exemplo:

h=4
h=2
h=1

1
44
12
12
12

2
94
18
18
18

3
55
55
44
42

4
42
42
42
44

5
12
44
55
55

6
18
94
94
94

(15, 26)
(1:3, 2:4, 35, . . . )
(1:2, 2:3, . . . )

Comentrios:
Para h = 4, as posies 1 e 5, e 2 e 6 so comparadas e trocadas
Para h = 2, as posies 1 e 3, 2 e 4, etc, so comparadas e trocadas se
estiverem fora de ordem
Para h = 1, corresponde ao algoritmo de insero, mas nenhum item tem
que mover muito!

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Shellsort: Seqncias para h


Referncia: D.E. Knuth, 1973, p. 95
hi = 3hi1 + 1 para s > 1
h1 = 1
para s = 1
A seqncia h = 1, 413, 40, 121, 363, 1093, . . . , obtida empiricamente,
uma boa seqncia.

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Algoritmo Shellsort
procedure
ShellSort (var A : Vetor);
label 999;
var i, j, h : integer;
T
: Item;

begin
h := 1;
repeat h := 3*h + 1 until h >= n;
repeat
h := h div 3;
for i := h+1 to n do
begin
T := A[i];
j := i;
while A[j-h].Chave > T.Chave do
begin
A[j] := A[j-h];
j := j - h;
if j <= h then goto 999;
end;
999:
A[j] := T;
end;
until h = 1;
end; {Shellsort}

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Shellsort: Ordem decrescente

h=4
h=2
h=1
h=1
h=1
h=1
h=1

1
6
2
2
1
1
1
1
1

2
5
1
1
2
2
2
2
2

3
4
4
4
4
4
3
3
3

4
3
3
3
3
3
4
4
4

5
2
6
6
6
6
6
6
5

6
1
5
5
5
5
5
5
6

Ci
2
4
1
1
2
1
2

Mi
6
0
3
0
3
0
3

13

15

(i = 2)
(i = 3)
(i = 4)
(i = 5)
(i = 6)
(Total)

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Comentrios sobre o Shellsort


Porque o Shellsort mais eficiente?
No sabemos pois ainda no foi analisado
Vrias seqncias para h foram experimentadas
Uma que funciona bem (verificao emprica):
hi = 3hi1 + 1
h1 = 1
h = 1, 4, 13, 40, 121, . . .
Anlise: duas conjecturas
C(n) = O(n(log n)2)
C(n) = O(n1.25)
Observaes:
Boa opo para arquivos mdios ( 10000 itens)
Implementao simples

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Heapsort
Mesmo princpio da ordernao por seleo:
Selecione o menor elemento do conjunto
Troque-o com o item da primeira posio
Repetir o processo para os n 1 restantes
Custo (comparaes) para obter o menor elemento entre n intens n 1
Este custo pode ser reduzido?
Sim, atravs da utilizao de uma estrutura de dados chamada fila de prioridades

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Fila de prioridades
Fila:
Sugere espera por algum servio
Indica ordem de atendimento, que FIFO
Prioridade:
Sugere que servio no ser fornecido com o critrio FIFO
Representada por uma chave que possui um certo tipo como, por exemplo,
um nmero inteiro
Fila de prioridades:
uma fila de elementos onde o prximo elemento a sair o que possui a
maior prioridade

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Aplicaes de fila de prioridades


Sistemas operacionais:
Chaves representam o tempo em que eventos devem ocorrer (por exemplo,
o escalonamento de processos)
Poltica de substituio de pginas na memria principal, onde a pgina a
ser substituda a de menor prioridade (por exemplo, a menos utilizada ou
a que est a mais tempo na memria)
Mtodos numricos:
Alguns mtodos iterativos so baseados na seleo repetida de um item
com o maior (menor) valor

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Aplicaes de fila de prioridades


Sistema de tempo compartilhado:
Projetista pode querer que processos que consomem pouco tempo possam
parecer instantneos para o usurio (tenham prioridade sobre projetos demorados)
Simulao:
A ordem do escalonamento dos eventos (por exemplo, uma ordem temporal)

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Tipo abstrato de dados: Fila de prioridades


Comportamento: item com maior (menor) prioridade o primeiro a sair
No mnimo duas operaes devem ser possveis:
Adicionar um item ao conjunto
Extrair um item do conjunto que tenha a maior prioridade
Operaes principais:
Construir uma fila de prioridades a partir de um conjunto com n elementos
Inserir um novo item
Retirar maior (menor) item
Substituir o maior item por um novo item, a no ser que o novo item seja
maior
Alterar prioridade de um item
Remover um item qualquer
Fundir duas filas de prioridades em uma

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Observaes sobre o TAD fila de prioridades


A nica diferena entre a operao de substituir e as operaes de inserir e
retirar executadas em seqncia que a operao de inserir aumenta a fila
temporariamente de tamanho
Operao Construir:
Equivalente ao uso repetido da operao de Inserir
Operao Alterar
Equivalente a Remover seguido de Inserir

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Representaes para filas de prioridades


Lista linear ordenada
Construir: O(n log n)
Inserir: O(n)
Retirar: O(1)
Lista linear no ordenada (seqencial)
Construir: O(n)
Inserir: O(1)
Retirar: O(n)
Ajuntar: O(1), no caso de apontadores, ou O(n), no caso de arranjos

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Representaes para filas de prioridades


Heap
Construir: O(n)
Inserir, Retirar, Substituir, Alterar: O(log n)
Ajuntar: depende da implementao. Por exemplo, rvores binomiais
eficiente e preserva o custo logartmico das quatro operaes anteriores
(J. Vuillemin, 1978)

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Questo importante
Como transformar o algoritmo para fila de prioridades em algoritmo para ordenao?
Uso repetido da operao de Inserir
Uso repetido da operao de Retirar
Lista ordenada: Insero
Lista seqencial: Seleo
Heap: Heapsort

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Heap
Heap:
Nome original lanado no contexto do heapsort
Posteriormente:
Garbage-collected storage em linguagens de programao, tais como
Lisp e Turbo Pascal/C/ . . .
Inventado por Williams (1964)
Construo do heap in situ Floyd (1964)

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Heap
Seqncia de itens com as chaves
C[i], C[2], . . . , C[n]
tal que
C[i] C[2i]
e
C[i] C[2i + 1]
para i = 1, 2, . . . , n
2
Ordem facilmente visualizada se a seqncia de chaves for desenhada em
uma rvore binria, onde as linhas que saem de uma chave levam a duas
chaves menores no nvel inferior
Estrutura conhecida como rvore binria completa

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Heap
Seja k1, k2, . . . , kn um conjunto de chaves onde para quaisquer duas chaves
ki e kj apenas uma das relaes
ki < k j ,
ki = kj ,
ki > kj
vlida.
se
ki < kj e kj < kl
ento
ki < k l

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Heap
Vamos atribuir s chaves ki aos nodos de uma rvore binria completa, na
ordem dos nveis

1 
k1
@
@
@


2 
k2
 A
A

A

A

A


@ 
@

3 
k3
 A
A





A
A
A

5 
4 
6 
7 
k4
k5
k6
k7
 A
A





A
A
A

9 
8 
k9
k8
A rvore binria acima um heap onde
K[i] K[2i]
K[i] K[2i + 1]

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvore binria completa




Nodos so numerados por nveis de 1 a


n, da esquerda para a direita, onde o nodo bk/2c pai do nodo k, para 1 < k n

1 
S










Z
Z
Z
Z
Z
Z
Z

2 
R



4 
E

J
J
J
JJ

5 
N

 B




3 
O



6 
A

 B
B


B


B

J
J
J
JJ

7 
D

 B
B


B


B

 B
B


B


B

B
B
B

As chaves na rvore satisfazem a condio do heap:


Chave de cada nodo maior que as
chaves de seus filhos, se existirem
A chave no nodo raiz a maior chave
do conjunto

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvore binria completa e Arranjo


Existe uma dualidade entre a representao usando vetor e a representao
de rvore
1 2 3 4 5 6 7
S B O E N A D
Seja, n o nmero de nodos e i o nmero de qualquer nodo. Logo,
Pai(i)

= bi/2c

Filho-esquerda(i) = 2i
Filho-direita(i)

para i 6= 1
para 2i n

= 2i + 1 para 2i + 1 n

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

rvore binria completa e Arranjo


Utilizao de arranjo:
Representao compacta
Permite caminhar pelos nodos da rvore facilmente fazendo apenas manipulao de ndices
Heap:
uma rvore binria completa na qual cada nodo satisfaz a condio do
heap apresentada
No caso de representar o heap por um arranjo, a maior chave est sempre
na posio 1 do vetor

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Heapsort
Princpio:
Construir o heap
A partir do heap construdo, pega-se o item na posio 1 do vetor (raiz do
heap) e troca-se com o item que est na posio n do vetor
A seguir, basta reconstruir o heap para os itens A[1], A[2], . . . , A[n 1]
Repita estas duas ltimas operaes com os n 1 itens restantes, depois
com os n 2 itens, at que reste apenas um item

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Exemplo de construo do heap


Chaves iniciais
Esq = 3
Esq = 2
Esq = 1

1
O
O
O
S

2
R
R
R
R

3
D
S
S
O

4
E
E
E
E

5
N
N
N
N

6
A
A
A
A

7
S
D
D
D

Dado um vetor A[1], A[2], . . . , A[n], itens A[n/2+1], A[n/2+2], . . . , A[n]


formam um heap, porque neste intervalo do vetor no existem dois ndices i
e j tais que j = 2i ou j = 2i + 1
No caso das chaves iniciais do exemplo, os itens de A[4] a A[7] formam a
parte inferior da rvore binria associada, onde nenhuma relao de ordem
necessria para formarem um heap

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Exemplo de construo do heap


Chaves iniciais
Esq = 3
Esq = 2
Esq = 1

1
O
O
O
S

2
R
R
R
R

3
D
S
S
O

4
E
E
E
E

5
N
N
N
N

6
A
A
A
A

7
S
D
D
D

O heap estendido para a esquerda (Esq = 3), englobando o item A[3], pai
de A[6] e A[7]
Agora a condio do heap violada, itens D e S so trocados
Heap novamente estendido para a esquerda (Esq = 2) incluindo o item R,
passo que no viola a condio do heap
Heap estendido para a esquerda (Esq = 1), a condio do heap violada,
itens O e S so trocados, encerrando o processo
Mtodo elegante que no necessita de nenhuma memria auxiliar

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Algoritmo para construir o heap


procedure Constri(var A: Vetor);
var Esq: ndice;
procedure Refaz(Esq,Dir:ndice; var A:Vetor);
label 999;
var i, j: ndice;
x
: Item;
begin
i := Esq; j := 2*i;
x := A[i];
while j <= Dir do
begin
if j < Dir
then if A[j].Chave
then goto 999;
A[i] := A[j];
i := j; j:= 2*i;
end;
999: A[i] := x;
end;

begin
Esq := (n div 2) + 1;
while Esq > 1 do
begin
Esq := Esq - 1;
Refaz(Esq, n, A);
end;
end;

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Exemplo de ordenao usando Heapsort


1
S
R
O
N
E
D
D

2
R
N
N
E
D
A
A

3
O
O
A
A
A
E
E

4
E
E
E
D
N
N
N

5
N
D
D
O
O
O
O

6
A
A
R
R
R
R
R

7
D
S
S
S
S
S
S

O caminho seguido pelo procedimento Refaz, para reconstituir a condio do


heap est em negrito
Aps a troca dos itens S e D, na segunda linha do exemplo, o item D volta
para a posio 5 aps passar pelas posies 1 e 2

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Algoritmo Heapsort
procedure Heapsort(var A: Vetor);
var Esq, Dir: ndice;
x
: Item;
{Entra aqui o procedimento Refaz}
begin
{Constri o heap}
Esq := (n div 2) + 1;
Dir := n;
while Esq > 1 do
begin
Esq := Esq - 1;
Refaz(Esq, Dir, A);
end;

{Ordena o vetor}
while Dir > 1 do
begin
x
:= A[1];
A[1]
:= A[Dir];
A[Dir] := x;
Dir := Dir - 1;
Refaz(Esq, Dir, A);
end
end;

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Anlise do Heapsort
primeira vista no parece eficiente:
Chaves so movimentadas vrias vezes
Procedimento Refaz gasta O(log n) operaes no pior caso
Heapsort:
Tempo de execuo proporcional a O(n log n) no pior caso!
Heapsort no recomendado para arquivos com poucos registros porque:
O tempo necessrio para construir o heap alto
O anel interno do algoritmo bastante complexo, se comparado com o anel
interno do Quicksort
Quicksort , em mdia, cerca de duas vezes mais rpido que o Heapsort
Entretanto, Heapsort melhor que o Shellsort para grandes arquivos

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Observaes sobre o algoritmo do Heapsort


O comportamento do heapsort O(n log n), qualquer que seja a entrada
Aplicaes que no podem tolerar eventualmente um caso desfavorvel devem usar o Heapsort
O algoritmo no estvel, pois ele nem sempre deixa os registros com chaves
iguais na mesma posio relativa

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores
Referncias:
Fundamentals of Data Structures, por E. Horowitz
Algoritmos e Estruturas de Dados, por Niklaus Wirth
Projeto de Algoritmos com Implementao em Pascal e C, captulo 4, por
Nivio Ziviane (1993)
Estruturas no-lineares
Representao natural para dados aninhados

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores
Muito teis para resolver uma enorme variedade de problemas envolvendo
algoritmos
Definio: Uma rvore A um conjunto finito de n nodos, tal que se n > 0,
ento:
Existe um nodo especial, chamado raiz da rvore.
Os restantes n 1 nodos esto particionados em m conjuntos disjuntos,
A1, . . . , Am, cada um dos quais por sua vez uma rvore. Estas rvores
A1, . . . , Am so sub-rvores da raiz.

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Representao de uma rvore: Conjuntos


aninhados
A
B

G
M

H
N

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Representao de uma rvore: Denteao


A
B
D
I
E
J
K
L
C
F
O
G
M
N
H
P

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Representao de uma rvore: Grafo




"
b
"
b
"
b
"
b
"
b
"
b
"
b
"

b 
"
b


J
%
J
%
J
%
J
%


J
%




Q


Q

Q

Q
Q

Q

Q









S

 B


S
B


S
B


S
BB
S


 



 


 

  
 

UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Representao de uma rvore: Parnteses


aninhados
A(B(D(I),E(J,K,L)),C(F(O),G(M,N),H(P)))

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores
rvore livre
Grafo conexo sem ciclos simples

HH

H

H
H


 

















HH
HH 
H


AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores
Grafo conexo sem ciclos simples

HH

H

H
H


 

















H
HH
H
H


AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores
rvore orientada:
rvore livre na qual um vrtice escolhido como sendo raiz figura
Raiz


Y
H

H
HH
H

 






?



?















?



*


?


HH
HH 
j
H


AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores
rvore ordenada:
rvore na qual os ramos de cada n so ordenados figura



 T
T

T

T





T
T

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores: Nvel


 T
T

T

T

T

T



A
A

A

A

A


A

 B
 B

B

B

B

B


 B
 B

B

B

B

B

Nvel:
O nvel do nodo raiz 0
Se um nodo est no nvel i ento a raiz de suas sub-rvores esto no nvel
i+1

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores: Altura


 T
T

T

T

T

T



A
A

A

A

A


A

 B
 B

B

B

B

B


 B
 B

B

B

B

B

Altura:
A altura de um nodo o comprimento do caminho mais longo deste nodo
at um nodo folha
A altura de uma rvore a altura do nodo raiz

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores: Grau


 T
T

T

T

T

T



A
A

A

A

A


A


 B
 B

B

B

B

B


 B
 B

B

B

B

B

Grau:
O grau de um nodo o nmero de sub-rvores que possui
Um nodo de grau 0 chamado nodo terminal folha

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores: Relaes de famlia




 T
T

T

T

T

T



A
A

A

A
A


A

 B
 B

B

B

B

B

Relaes de famlia:
Pai, Filho, Irmo, Ancestrais, etc


 B
 B

B

B

B

B

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores
Uma floresta um conjunto de zero ou mais rvores disjuntas
Para transformar uma floresta formada por x rvores em uma nica rvore
basta acrescentar x 1 arestas entre essas rvores
rvore binria (D.E. Knuth, p. 309, vol. 3):
Conjunto finito de nodos, que vazio ou consiste em um nodo raiz e em
duas sub-rvores disjuntas, chamadas sub-rvores esquerda e direita

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvores

l
,
,
l
,
l
,
l
,
l 

l
,


J
J

JJ



 B
 B
B

B


 Nodo

Interno

Nodo Externo


 B
 B
B

B



 B
 B
B

B



 B
 B
B

B


UFMG/ICEx/DCC

AEDS2/1 Semestre de 2002

Exemplos de rvores binrias


rvores genealgicas, nas quais os pais de uma pessoa so representados
como descendentes do n associado a pessoa
O histrico de um torneio de tnis, em que cada jogo representado por um
n que indica o seu vencedor, e tem dois jogos previamente vencidos pelos
dois adversrios representados como seus descendentes
Uma expresso aritmtica com operadores diticos, na qual cada operador
faz o papel de um n da rvore, sendo representados seus dois operandos
como sub-rvores

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Exemplos de rvores binrias






J
J

JJ




 B
 B
 B
 B
B
B


B
B








 B
 B
 B
 B
B
B


B
B









AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvore binria completa



l
,
,
l
,
l
,
l
,
l 

l
,


J
J

JJ



 B
 B
B

B



 B
 B
B

B



 B
 B
B

B



 B
 B
B

B


Exemplo:
Nodos folha aparecem em dois nveis adjacentes
Nodos do nvel mais baixo esto posicionados mais a esquerda
Mais precisamente: Nodos numerados de 1 a n, onde nodos bk/2c pai
do nodo k, para 1 < k n

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

rvore binria


Em uma rvore binria qualquer:


# nodos externos =
# nodos internos + 1
Em uma rvore binria completa:
# nodos externos 2h,
onde h = altura


 T
T

T

T

T

T



A
A

A

A

A


A

 B
 B

B

B

B

B


 B
 B

B

B

B

B

h=3

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Representao de rvores usando listas


encadeadas


1

 B
 B
B

B




2
3


 B
 B
B

B




Esq Reg

4
5



type Registro

= record
Chave: TipoChave;
{outros componentes}
end;

Apontador = ^Nodo;
Nodo
= record
Reg
: Registro;
Esq, Dir: Apontador;
end;

Dir
@
R
@

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Caminhamento em rvores
Pr-ordem
Visita raiz
Caminha na sub-rvore da esquerda em pr-ordem
Caminha na sub-rvore da direita em pr-ordem
Central ou Inordem
Caminha na sub-rvore da esquerda na ordem central
Visita raiz
Caminha na sub-rvore da direita na ordem central
Ps-ordem
Caminha na sub-rvore da esquerda em ps-ordem
Caminha na sub-rvore da direita em ps-ordem
Visita raiz

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Algoritmo para caminhamento pr-ordem


procedure PreOrdem(p: Apontador);
begin
if p <> nil
then begin
writeln(p^.Reg.Chave);
PreOrdem(p^.Esq);
PreOrdem(p^.Dir);
end;
end;





J
J

JJ





J
J

JJ










Pr-Ordem: E B A D C F

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Algoritmo para caminhamento central ou inordem


procedure InOrdem(p: Apontador);
begin
if p <> nil
then begin
InOrdem(p^.Esq);
writeln(p^.Reg.Chave);
InOrdem(p^.Dir);
end;
end;





J
J

JJ





J
J

JJ










Inordem: A B C D E F
Observe: Este procedimento representa
um mtodo de ordenao similar ao Quicksort, onde a chave na raiz faz o papel do
item que particiona o vetor.

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Algoritmo para caminhamento ps-ordem


procedure PosOrdem(p: Apontador);
begin
if p <> nil
then begin
PosOrdem(p^.Esq);
PosOrdem(p^.Dir);
writeln(p^.Reg.Chave);
end;
end;





J
J

JJ





J
J

JJ










Ps-Ordem: A C D B F E

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Quicksort
Proposto por C.A.R. Hoare (19591960)
British Council Visiting Student na Universidade de Moscou
Quicksort o algoritmo de ordenao interna mais rpido que se conhece
para uma ampla variedade de situaes, sendo provavelmente mais utilizado
do que qualquer outro algoritmo
Idia bsica:
Partir o problema de ordenar um conjunto com n itens em dois problemas
menores
Ordenar independentemente os problemas menores
Combinar os resultados para produzir a soluo do problema maior

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Quicksort
Parte Delicada do Mtodo:
Procedimento Partio
Idia bsica:
Fazer uma escolha arbitrria de um item x do vetor chamado piv
Rearranjar o vetor A[Esq..Dir] de tal forma que ao final o vetor A est
particionado em uma parte esquerda com chaves menores ou iguais a x e
uma parte direita com chaves maiores ou iguais a x
Aplicar a cada uma das duas parties geradas os dois passos anteriores

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Quicksort
Quicksort(int A[],
int Esq,
int Dir)
{
int i;
if (Dir > Esq)
{
i = Partition(Esq, Dir)
Quicksort(A, Esq, i-1);
Quicksort(A, i+1, Dir);
}
}

/* Apontadores se cruzaram? */
/* Particiona de acordo com o piv */
/* Ordena sub-vetor da esquerda */
/* Ordena sub-vetor da direita */

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Quicksort
Os parmetros Esq e Dir definem os limites dos sub-vetores a serem ordenados
Chamada inicial:
Quicksort(A, 1, n)
O procedimento Partition o ponto central do mtodo, que deve rearranjar
o vetor A de tal forma que o procedimento Quicksort possa ser chamado
recursivamente

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Procedimento Partition
Rearranja o vetor A[Esq..Dir ] de tal forma que:
O piv (item x) vai para seu lugar definitivo A[i], 1 i n
Os itens A[Esq], A[Esq+1], . . . , A[i 1] so menores ou iguais a A[k]
Os itens A[i + 1], A[i + 2], . . . , A[Dir ] so maiores ou iguais a A[i]
Comentrios:
Note que ao final da partio no foi feita uma ordenao nos itens que
ficaram em cada um dos dois sub-vetores, mas sim o rearranjo explicado
acima
O processo de ordenao continua aplicando o mesmo princpio a cada um
dos dois sub-vetores resultantes, ou seja, A[Esq..i 1] e A[i + 1..Dir ]

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Procedimento Partition
Escolher piv (Sedgewick):
Escolha o item A[Dir ] (x) do vetor que ir para sua posio final
Observe que este item no est sendo retirado do vetor
Partio:
Percorra o vetor a partir da esquerda (Esq) at encontrar um item A[i] > x;
da mesma forma percorra o vetor a partir da direita (Dir ) at encontrar um
item A[j] < x
Como os dois itens A[i] e A[j] esto fora de lugar no vetor final, eles devem
ser trocados
O processo ir parar quando os elementos tambm so iguais a x (melhora
o algoritmo), apesar de parecer que esto sendo feitas trocas desnecessrias

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Procedimento Partition
Continue o processo at que os apontadores i e j se cruzem em algum ponto
do vetor
Neste momento, deve-se trocar o elemento A[Dir ] com o mais esquerda
do sub-vetor da direita

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Exemplo da partio do vetor


1
A

2
S

3
O

4
R

5
T

6
I

7
N

8
G

9 10 11 12 13 14 15
E X A M P L E

6
I

7
N

8
G

9 10 11 12 13 14 15
E X A M P L E

Esq = 1 e Dir = 15
Escolha do piv (item x):
Item x = A[15] = E
1
A

2
S

3
O

4
R

5
T

Piv

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Exemplo da partio do vetor


1
A
A

2
S
S

3
O

4
R

5
T

6
I

7
N

8
G

9 10 11 12 13 14 15
E X A M P L E
A M P L E

j
Piv

A varredura a partir da posio 1 pra no item S (S > E) e a varredura a partir


da posio 15 pra no item A (A < E), sendo os dois itens trocados
Como o vetor ainda no foi todo rearranjado (i e j se cruzarem) o processo
deve continuar
1
A
A

2
S
A

3
O

4
R

5
T

6
I

7
N

8
G

9 10 11 12 13 14 15
E X A M P L E
S M P L E

j
Piv

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Exemplo da partio do vetor


1
A
A

2
S
A

3
O
O

4
R

5
T

6
I

7
N

8
G

9 10 11 12 13 14 15
E X A M P L E
E X S M P L E

j
Piv

A varredura a partir da posio 2 pra no item O (O > E) e a varredura a partir


da posio 11 pra no item E (x = E), sendo os dois itens trocados
Como o vetor ainda no foi todo rearranjado (i e j se cruzarem) o processo
deve continuar
1
A
A

2
S
A

3
O
E

4
R

5
T

6
I

7
N

8
G

9 10 11 12 13 14 15
E X A M P L E
O X S M P L E

j
Piv

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Exemplo da partio do vetor


1
A
A

2
S
A

3
O
E

4
R
R

5
T
T

6
I
I

7
N
N

8
G
G

9 10 11 12 13 14 15
E X A M P L E
O X S M P L E

Piv

A varredura a partir da posio 3 pra no item R (R > E) e a varredura a partir


da posio 9 pra no item E (x = E), sendo que os apontadores se cruzam
Piv deve ser trocado com o R (item mais esquerda do sub-vetor da direita)
1
A
A

2
S
A

3
O
E

4
R
E

5
T
T

6
I
I

7
N
N

8
G
G

9 10 11 12 13 14 15
E X A M P L E
O X S M P L R

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Quicksort: Procedimento Partio


Quicksort(int A[], int Esq, int Dir)
{
int x,
/* Piv */
i, j,
/* Apontadores para o sub-vetor */
t;
/* Varivel auxiliar para troca */
if (Dir
{
x =
i =
j =

> Esq)

/* Apontadores se cruzaram? */

A[Dir];
Esq - 1;
Dir;

/* Define o piv */
/* Inicializa apontador da esq */
/* Inicializa apontador da dir */

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Quicksort: Procedimento Partio


/* Faz a varredura no vetor */
for (;;)
{
while (a[++i] < x);
/* Percorre a partir da esquerda */
while (a[--j] > x);
/* Percorre a partir da direita */
if (i >= j) break;
/* Apontadores se cruzaram? */
t
= A[i];
A[i] = A[j];
A[j] = t;

/* Faz a troca entre os elementos */

}
}

t
= A[i];
A[i] = A[j];
A[j] = t;

/* Coloca o piv na posio final */

Quicksort(A, Esq, i-1);


Quicksort(A, i+1, Dir);

/* Ordena sub-vetor da esquerda */


/* Ordena sub-vetor da direita */

AEDS2/1 Semestre de 2002

UFMG/ICEx/DCC

Quicksort: Seqncia de passos recursivos


1
A
A
A

2
A
A
A

3
E
E

4
E

5
T

6
I

7
N

8
G

9 10 11 12 13 14 15
O X S M P L R

L
L
G

I
I
I
I

N
G
L
L

G
M

O
O

P
P

M
N

P
O

O
P

T
T
T

X
X
X

Você também pode gostar