Tipos de Ordenao
Outros Tipos de Ordenao
SCC-501 - Captulo 4
Mtodos de Ordenao
Joo Lus Garcia Rosa1
1 Departamento de Cincias de Computao
Instituto de Cincias Matemticas e de Computao
Universidade de So Paulo - So Carlos
http://www.icmc.usp.br/~joaoluis
2011
c 2011 - SCC-501: IV. Mtodos de Ordenao
Joo Lus G. Rosa
1/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
2/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
3/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Importncia da Ordenao
4/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
5/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Terminologia bsica
6/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Terminologia bsica
7/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Terminologia bsica
Figuras [2]:
8/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Terminologia bsica
ATENO
No existe um mtodo de ordenao considerado
universalmente superior a todos os outros. necessrio
analisar o problema e, com base nas caractersticas dos
dados, decidir qual o mtodo que melhor se aplica ele.
9/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
10/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
11/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
12/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Tipos de Ordenao
Ordenao:
por Troca
por Seleo
por Insero
de Shell
por Clculo de Endereo
por Intercalao
por Contagem de Menores
por Contagem de Tipos
de Razes
13/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
14/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
2 tipos:
Bolha (bubble sort)
Quicksort
Bolha
Caracterstica do mtodo:
algoritmo fcil
pouco eficiente
15/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
x[1]
57
x[2]
48
x[3]
37
x[4]
12
x[5]
92
x[6]
86
x[7]
33
Primeira passagem:
x[0] com x[1] (25 com 57):
x[1] com x[2] (57 com 48):
x[2] com x[3] (57 com 37):
x[3] com x[4] (57 com 12):
x[4] com x[5] (57 com 92):
x[5] com x[6] (92 com 86):
x[6] com x[7] (92 com 33):
nenhuma troca
troca
troca
troca
nenhuma troca
troca
troca
16/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
x[1]
48
x[2]
37
x[3]
12
x[4]
57
x[5]
86
x[6]
33
x[7]
92
17/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
x[0]
25
25
25
25
12
12
12
x[1]
57
48
37
12
25
25
25
x[2]
48
37
12
37
37
33
33
x[3]
37
12
48
48
33
37
37
x[4]
12
57
57
33
48
48
48
x[5]
92
86
33
57
57
57
57
x[6]
86
33
86
86
86
86
86
x[7]
33
92
92
92
92
92
92
18/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
19/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
20/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
21/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
soma: 1 + 2 + 3 + 4 + ... + (n 1) =
(n2 n)
2
portanto: O(n2 )
c 2011 - SCC-501: IV. Mtodos de Ordenao
Joo Lus G. Rosa
22/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
4
5
23/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
x[1]
57
x[2]
48
x[3]
37
x[4]
12
x[5]
92
x[6]
86
x[7]
[33]j
24/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
25/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
26/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
x[1]
25
x[2]
33
x[3]
37
x[4]
48
x[5]
57
x[6]
86
x[7]
92
27/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Programa quicksort
void quicksort(int x[], int n)
{
struct elemtipo elemento; struct LIFO pilha; int i,j;
pilha.top = -1; elemento.inf = 0; elemento.sup = n-1;
push(&pilha, &elemento);
while (!vazia(&pilha)) // repete enquanto existir algum subvetor no classificado
{
pop(&pilha,&elemento);
while (elemento.inf < elemento.sup)
{ // processa a subvetor seguinte
particao(x, elemento.inf, elemento.sup, &j);
// empilha o subvetor maior
if (j-elemento.inf > elemento.sup-j)
{ // empilha o subvetor inferior
i = elemento.sup;
elemento.sup = j-1;
push(&pilha, &elemento);
// processa o subvetor superior
elemento.inf = j+1; elemento.sup = i;
}
else
{ // empilha o subvetor superior
i = elemento.inf;
elemento.inf = j+1;
push(&pilha, &elemento);
// processa o subvetor inferior
elemento.inf = i; elemento.sup = j-1;
}
}
}
} G. Rosa
c 2011 - SCC-501: IV. Mtodos de Ordenao
Joo Lus
28/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Programa quicksort
void particao(int x[], int min, int max, int *p)
{
int a, i, temp, j, troca;
a = x[min]; // a o elemento cuja posio final procurada (piv)
j = max;
i = min;
troca = 0;
while (i < j)
{
if (!troca)
while (x[i] <= x[j] && i < j)
j- -;
else
while (x[i] <= x[j] && i < max)
i++;
if (i < j)
{ // troca x[i] e x[j]
temp = x[i];
x[i] = x[j];
x[j] = temp;
troca = 1-troca;
}
}
x[j] = a;
*p = j;
}
29/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Eficincia do quicksort
Suponha que:
o tamanho do arquivo de dados n seja uma potncia de 2,
ou seja, n = 2m , de modo que m = log2 n;
a posio correta para o piv termine sempre sendo o
meio exato do subvetor.
Assim
ocorrero aproximadamente n comparaes (na realidade
n 1) na primeira passagem, aps a qual o arquivo ser
dividido em dois sub-arquivos com tamanho n/2;
para cada um destes arquivos ocorrem n/2 comparaes
e formado um total de 4 arquivos, cada qual com o
tamanho n/4, e assim por diante;
depois de separar os sub-arquivos m vezes, existiro n
arquivos de tamanho 1.
c 2011 - SCC-501: IV. Mtodos de Ordenao
Joo Lus G. Rosa
30/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Eficincia do quicksort
Assim, o nmero total de comparaes para a ordenao
inteira ser aproximadamente
n + 2 (n/2) + 4 (n/4) + ... + n (n/n)
ou
n + n + n + ... + n (m termos)
comparaes. Assim O(n m) ou O(n log n) (lembre-se
de que m = log2 n).
Portanto, se as condies descritas anteriormente forem
satisfeitas, a ordenao rpida (quick sort) ser
O(n log n), o que relativamente eficiente.
31/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
32/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Seleo Direta
Idia Bsica:
1
2
3
33/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Seleo Direta
void selectsort(int x[], int n)
{
int i, indx, j, maior;
for (i = n-1; i > 0; i- -)
{
maior = x[0];
indx = 0;
for (j = 1; j <= i; j++)
if (x[j] > maior)
{
maior = x[j];
indx = j;
}
x[indx]= x[i];
x[i] = maior;
}
}
34/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Heap Sort
35/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Heap
100
19
36
17
25
36/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Heap Sort
37/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Heap Sort
PASSOS:
1
2
3
38/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Heap Sort
void fazheap(int a[], int n)
{
int i;
// reajusta os elementos em a[0:n-1] para formar um heap
for (i = (n-1)/2; i >= 0; i- -)
ajuste(a,i,n-1);
}
39/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Heap Sort
void ajuste(int a[], int i, int n)
{
// rvores binrias completas com razes 2(i+1)-1 e 2(i+1) so
// combinadas com o n i para formar um heap com raiz i.
// Nenhum n tem endereo maior que n-1 ou menor que 0.
int item, j;
j = 2*(i+1)-1;
item = a[i];
while (j <= n)
{
if ((j < n) && (a[j] < a[j+1]))
j = j + 1;
// compara sucessor da esquerda com o da direita : j o maior
if (item >= a[j])
break;
// uma posio para item encontrada
a[(j+1)/2-1] = a[j];
j = 2*(j+1)-1;
}
a[(j+1)/2-1] = item;
}
40/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Heap Sort
iterao
fazheap: i=3
fazheap: i=2
fazheap: i=1
fazheap: i=0
heapsort: i=7
heapsort: i=6
heapsort: i=5
heapsort: i=4
heapsort: i=3
heapsort: i=2
heapsort: i=1
x[0]
25
25
25
92
86
57
48
37
33
25
12
x[1]
57
57
57
57
57
37
37
25
25
12
25
x[2]
48
92
92
86
48
48
33
33
12
33
33
x[3]
37
37
37
37
37
25
25
12
37
37
37
x[4]
12
12
12
12
12
12
12
48
48
48
48
x[5]
92
48
48
48
33
33
57
57
57
57
57
x[6]
86
86
86
25
25
86
86
86
86
86
86
x[7]
33
33
33
33
92
92
92
92
92
92
92
41/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
42/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
43/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
44/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Insero Simples
Desempenho: O(n2 )
45/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Insero Simples
iterao
k=0
k=1
k=2 (for i=1)
k=3 (for i=2,1)
k=4 (for i=3,2,1,0)
k=5
k=6 (for i=5)
k=7 (for i=6,5,4,3,2)
x[0]
25
25
25
25
12
12
12
12
x[1]
57
57
48
37
25
25
25
25
x[2]
48
48
57
48
37
37
37
33
x[3]
37
37
37
57
48
48
48
37
x[4]
12
12
12
12
57
57
57
48
x[5]
92
92
92
92
92
92
86
57
x[6]
86
86
86
86
86
86
92
86
x[7]
33
33
33
33
33
33
33
92
46/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Insero Simples
Variaes do Mtodo:
insero com pesquisa binria: consiste em utilizar o
mtodo da busca binria para localizar a posio a ser
inserido o elemento:
Diminui o nmero de comparaes mas ainda necessrio
efetuar o deslocamento dos elementos para a insero.
Isso sendo executado n vezes resulta em O(n2 )
substituies.
De modo geral no ajuda!
47/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
48/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Ordenao de Shell
Tem como objetivo aumentar o passo de movimento dos
elementos ao invs das posies adjacentes (passo = 1).
consiste em classificar sub-arquivos do original;
esses sub-arquivos contm todo k -simo elemento do
arquivo original;
o valor de k chamado de incremento;
por exemplo, se k 5, o sub-arquivo consistindo dos
elementos x[0], x[5], x[10], ... classificado primeiro.
Cinco sub-arquivos, cada um contendo um quinto dos
elementos do arquivo original, so classificados dessa
maneira.
So eles:
sub-arquivo 1 -> x[0] x[5] x[10] ...
sub-arquivo 2 -> x[1] x[6] x[11] ...
sub-arquivo 3 -> x[2] x[7] x[12] ...
sub-arquivo 4 -> x[3] x[8] x[13] ...
sub-arquivo 5 -> x[4] x[9] x[14] ...
c 2011 - SCC-501: IV. Mtodos de Ordenao
Joo Lus G. Rosa
49/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Ordenao de Shell
50/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Ordenao de Shell
51/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Ordenao de Shell
incremento
x[0]
x[1]
x[2]
x[3]
x[4]
x[5]
5 (0)
5 (1)
5 (2)
3 (0)
3 (1)
3 (2)
3 (3)
3 (4)
1 (0)
1 (1)
1 (2)
1 (3)
1 (4)
1 (5)
1 (6)
25
57
25
25
57
48
48
37
37
37
12
12
12
12
25
25
25
25
25
57
57
12
12
12
12
33
33
33
33
33
33
33
12 25
12
25 33
12
25
33
12
12
12
12
25
25
25
25
33
33
33
33
37
37
37
37
37
37
37
57
57
57
48
48
48
48
x[6]
x[7]
92
86
92
92
92
92
86
33
33
92
92
92
92
92
92
92
86
86
86
86
86
86
86
86
86
86
86
48
48
48
48
48
57
57
57
57
57
57
57
37
37 48
37
48 92
37
48
86 92
37
48
57 86 92
52/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
53/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
54/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
55/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
x[1]
57
x[2]
48
x[3]
37
x[4]
12
x[5]
92
x[6]
86
x[7]
33
56/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
57/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
58/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
59/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
60/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
61/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
x[1]
57
x[2]
48
x[3]
37
x[4]
12
x[5]
92
x[6]
86
x[7]
33
[57]
[25 57]
[48]
[37]
[37 48]
[25 37 48 57]
[12]
[92]
[12 92]
[86]
[33]
[33 86]
[12 33 86 92]
[12 25 33 37 48 57 86 92]
62/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
63/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Exemplo:
64/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
65/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
66/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
67/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
68/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
69/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Complexidade de tempo?
Complexidade de espao?
70/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
71/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Sumrio
1
Ordenao
Importncia da Ordenao
Terminologia bsica
Eficincia
Tipos de Ordenao
Ordenao por Troca
Ordenao por Seleo
Ordenao por Insero
72/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
73/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Exemplo:
74/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Exemplo:
75/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
76/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
77/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
78/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
79/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Complexidade de tempo?
Complexidade de espao?
80/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
81/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
82/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
final
12
33
92
fila[0]
fila[1]
fila[2]
fila[3]
fila[4]
fila[5]
fila[6]
fila[7]
fila[8]
fila[9]
c 2011 - SCC-501: IV. Mtodos de Ordenao
Joo Lus G. Rosa
25
86
57
48
37
83/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
final
12
25
33
48
57
37
fila[0]
fila[1]
fila[2]
fila[3]
fila[4]
fila[5]
fila[6]
fila[7]
fila[8]
fila[9]
86
92
Lista classificada: 12 25 33 37 48 57 86 92
c 2011 - SCC-501: IV. Mtodos de Ordenao
Joo Lus G. Rosa
84/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
85/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
86/91
Ordenao
Tipos de Ordenao
Outros Tipos de Ordenao
Concluso Geral
87/91
Apndice
Bibliografia
Bibliografia I
88/91
Apndice
Bibliografia
Bibliografia II
[4] Liang, Zhao
Aula 4 - Ordenao 2. Introduo Cincia da
Computao II - SCE0535.
Slides. Cincia de Computao. ICMC/USP, 2008.
[5] Pardo, Thiago A. S.
Anlise de Algoritmos. SCE-181 Introduo Cincia da
Computao II.
Slides. Cincia de Computao. ICMC/USP, 2008.
[6] Tenenbaum, A. M., Langsam, Y., Augestein, M. J.
Estruturas de Dados Usando C.
Makron Books, 1995.
89/91
Apndice
Bibliografia
Bibliografia III
[7] Wirth, N.
Algoritmos e Estruturas de Dados.
LTC, 1989.
90/91
Apndice
Bibliografia
Referncias I
[1] Knuth, D. E.
The Art of Computer Programming.
Volume 3. Reading, Mass.: Addison-Wesley, 1973.
[2] Shell, D. L.
A High-Speed Sorting Procedure.
Communications of the ACM, Volume 2, Issue 7 (July
1959), pp. 3032.
91/91