Escolar Documentos
Profissional Documentos
Cultura Documentos
Algoritmos de Ordenao na
Memria Principal
Antonio Alfredo Ferreira Loureiro
loureiro@dcc.ufmg.br
http://www.dcc.ufmg.br/~loureiro
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
UFMG/ICEx/DCC
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.
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.
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;
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.
UFMG/ICEx/DCC
4 15 9
8 ...
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.
UFMG/ICEx/DCC
!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!!
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
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
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}
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
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}
UFMG/ICEx/DCC
Ci = i
Caso mdio:
Pi
i+1
1
Ci = i j=1 j = 1i ( i(i+1)
)
=
2
2
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
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
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
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
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
UFMG/ICEx/DCC
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
2
4
Movimentos:
3n2 3n
M (n) =
4
4
UFMG/ICEx/DCC
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
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!
UFMG/ICEx/DCC
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}
UFMG/ICEx/DCC
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)
UFMG/ICEx/DCC
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
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
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
UFMG/ICEx/DCC
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
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)
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
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
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]
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
= 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
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
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
begin
Esq := (n div 2) + 1;
while Esq > 1 do
begin
Esq := Esq - 1;
Refaz(Esq, n, A);
end;
end;
UFMG/ICEx/DCC
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
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;
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
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
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.
UFMG/ICEx/DCC
G
M
H
N
UFMG/ICEx/DCC
UFMG/ICEx/DCC
"
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
UFMG/ICEx/DCC
rvores
rvore livre
Grafo conexo sem ciclos simples
HH
H
H
H
HH
HH
H
UFMG/ICEx/DCC
rvores
Grafo conexo sem ciclos simples
HH
H
H
H
H
HH
H
H
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
UFMG/ICEx/DCC
rvores
rvore ordenada:
rvore na qual os ramos de cada n so ordenados figura
T
T
T
T
T
T
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
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
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
UFMG/ICEx/DCC
Relaes de famlia:
Pai, Filho, Irmo, Ancestrais, etc
B
B
B
B
B
B
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
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
UFMG/ICEx/DCC
J
J
JJ
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
rvore binria
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
UFMG/ICEx/DCC
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
@
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
UFMG/ICEx/DCC
J
J
JJ
J
J
JJ
Pr-Ordem: E B A D C F
UFMG/ICEx/DCC
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.
UFMG/ICEx/DCC
J
J
JJ
J
J
JJ
Ps-Ordem: A C D B F E
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
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
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 */
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
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 ]
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
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
UFMG/ICEx/DCC
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
UFMG/ICEx/DCC
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
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
UFMG/ICEx/DCC
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
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
UFMG/ICEx/DCC
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
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
UFMG/ICEx/DCC
> Esq)
/* Apontadores se cruzaram? */
A[Dir];
Esq - 1;
Dir;
/* Define o piv */
/* Inicializa apontador da esq */
/* Inicializa apontador da dir */
UFMG/ICEx/DCC
}
}
t
= A[i];
A[i] = A[j];
A[j] = t;
UFMG/ICEx/DCC
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