Professional Documents
Culture Documents
Razes pedaggicas
Bom exemplo para aprender terminologia, compreender contexto dos
problemas e bom princpios para desenvolvimento de algoritmos
mais sofisticados
Alguns so fceis de generalizar para mtodos mais eficientes ou
para melhorar o desempenho de outros algoritmos
AED (IST/DEEC)
AED (IST/DEEC)
int Item;
key(A) (A)
less(A, B) (key(A) < key(B))
exch(A, B) {Item t = A; A = B; B = t; }
compexch(A, B) if (less(B,A)) exch(A, B)
Nomenclatura [1]
Tipos de Algoritmos de Ordenao
no adaptativos: sequncia de operaes independente da ordenao
original dos dados
interessantes para implementao em hardware
Nomenclatura [2]
Definio: um algoritmo de ordenao dito estvel se
preserva a ordem relativa dos items com chaves repetidas
ex: ordenar lista de alunos por ano de graduao quando esta j
est ordenada alfabeticamente por nome
usualmente possvel estabilizar um algoritmo alterando a sua
chave (tem custo adicional)
algoritmos bsicos so quase todos estveis, mas poucos
algoritmos avanados so estveis
AED (IST/DEEC)
Nomenclatura [3]
Definio: um algoritmo de ordenao dito interno, se o
conjunto de todos os dados a ordenar couber na memria;
caso contrrio dito externo
ex: ordenar dados lidos de tape ou disco ordenao externa
AED (IST/DEEC)
Nomenclatura [4]
Definio: um algoritmo de ordenao dito directo se os
dados so acedidos directamente nas operaes de
comparao e troca; caso contrrio dito indirecto
AED (IST/DEEC)
Contexto de utilizao
Mesmo programa, diferentes drivers para diferentes algoritmos:
#include <stdio.h>
#include <stdlib.h>
main (int argc, char *argv[]){
int i, N = atoi (argv[1]), sw = atoi (argv[2]);
int *a = malloc (N * sizeof(int));
if (sw)
for (i = 0; i < N; i++)
a[i] = 1000 * (1.0 * rand() / RAND_MAX);
else
while (scanf(%d, &a[N]) == 1) N++;
sort (a, 0, N-1);
for (i = 0; i < N; i++) printf(%3d, a[i]);
printf(\n);
Ciclo
Ciclo
interior
exterior
AED (IST/DEEC)
10
N G E X A M P L E
A S O R T I N G E X A M P L E
A A O R T I N G E X S M P L E
A A E R T I N G O X S M P L E
A A E E T I N G O X S M P L R
A A E E G I N T O X S M P L R
A A E E G I
N T O X S M P L R
A A E E G I L T O X S M P N R
A A E E G I
A A E E G I
L M O X S T P N R
L M N X S T P O R
A A E E G I L M N O S T P X R
A A E E G I L M N O P T S X R
A A E E G I
A A E E G I
L M N O P R S X T
L M N O P R S X T
A A E E G I L M N O P R S T X
A A E E G I
AED (IST/DEEC)
L M N O P R S T X
11
comparaes e N trocas
Demonstrao: para cada item i de 1 a N-1 h uma troca e N-i
comparaes (ver sombreados no exemplos)
Logo h N-1 trocas e (N-1)+(N-2)+...+2+1=N(N-1)/2 comparaes
Factos: desempenho independente da ordenao inicial dos dados; a
nica coisa que depende desta ordenao o nmero de vezes que
min actualizado (quadrtico no pior caso, N log N em mdia)
AED (IST/DEEC)
12
AED (IST/DEEC)
13
14
AED (IST/DEEC)
15
AED (IST/DEEC)
16
AED (IST/DEEC)
17
18
19
Bubble Sort
Talvez o algoritmo mais utilizado e o que muitas pessoas
aprendem
Ideia: fazer mltiplas passagens pelos dados trocando de cada
vez dois elementos adjacentes que estejam fora de ordem,
at no haver mais trocas
supostamente muito fcil de implementar
usualmente mais lento que os dois mtodos elementares estudados
void bubble(Item a[], int l, int r){
int i, j;
for (i = l; i < r; i++)
for (j = r; j > i; j--)
compexch(a[j-1], a[j]);
}
AED (IST/DEEC)
20
AED (IST/DEEC)
21
AED (IST/DEEC)
22
23
24
AED (IST/DEEC)
Insertion
Bubble
N2/2
N2/4
N2/2
N2/4
N2/2
25
AED (IST/DEEC)
26
AED (IST/DEEC)
27
Verso elementar
Verso adaptativa
Exemplo de aplicao
Anlise de Eficincia
28
Shellsort:
acelerar o algoritmo permitindo trocas entre elementos que esto
afastados
como?
AED (IST/DEEC)
29
AED (IST/DEEC)
30
AED (IST/DEEC)
31
i%4=0
AIORESNGPXAMTLE
AIORESNGPXAMTLE
AIORELNGPSAMTXE
i%4=1
0,4,8,12
1,5,9,13
AINRELOGPSAMTXE
AIARELNGPSOMTXE
AIARELEGPSNMTXO
i%4=2
AIAGELERPSNMTXO
AIAGELEMPSNRTXO
i%4=3
2,6,10,14
3,7,11
AIAGELEMPSNRTXO
AED (IST/DEEC)
32
33
Parties
esto
entrelaadas
AED (IST/DEEC)
ASORTINGEXAMPLE
AIORTSNGEXAMPLE
AINRTSOGEXAMPLE
AINGTSOREXAMPLE
AINGESORTXAMPLE
AINGESORTXAMPLE
AIAGESNRTXOMPLE
AIAGESNMTXORPLE
AIAGESNMPXOMTLE
AIAGELNMPSORTXE
AIAGELEMPSNRTXO
34
AED (IST/DEEC)
35
Sequncia de Ordenao
Difcil de escolher
propriedades de muitas sequncias foram j estudadas
possvel provar que umas melhores que outras
ex: 1, 4, 13, 40, 121, 364, 1093, 3280, ... (Knuth, 3*hant+1)
melhor que
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, ... (Shell, 2i )
Porqu?
mas pior (20%) que 1, 8, 23, 77, 281, 1073, 4193, (4i+1 + 3 2i + 1)
36
Shellsort
void shellsort(Item a[], int l, int r)
{
int i, j, k;
int incs[16] = { 1391376, 463792, 198768, 86961, 33936,
13776, 4592, 1968, 861, 336, 112, 48,
21, 7, 3, 1 };
for ( k = 0; k < 16; k++) {
int h = incs[k];
for (i = l+h; i <= r; i++) {
Item v = a[i];
j = i;
while (j-h >= l && less(v, a[j-h]))
a[j] = a[j-h];
j -= h;
}
a[j] = v;
}
}
}
AED (IST/DEEC)
37
AED (IST/DEEC)
AEAGEINMPLORTXS
AAEGEINMPLORTXS
AAEGEINMPLORTXS
AAEEGINMPLORTXS
AAEEGINMPLORTXS
AAEEGINMPLORTXS
AAEEGIMNPLORTXS
AAEEGIMNPLORTXS
AAEEGILMNPORTXS
AAEEGILMNOPRTXS
AAEEGILMNOPRTXS
AAEEGILMNOPRTXS
AAEEGILMNOPRTXS
AAEEGILMNOPRSTX
AAEEGILMNOPRSTX
38
Anlise de Shellsort
Propriedades:
o resultado de h-ordenar um ficheiro que est k-ordenado um
ficheiro que est simultaneamente h- e k-ordenado
Shellsort faz menos do que O(N3/2) comparaes para os
incrementos
1, 4, 13, 40, 121, 364, 1093, ...
Shellsort faz menos do que O(N4/3) comparaes para os
incrementos
1, 8, 23, 77, 281, 1073, 4193, 16577, ...
Nota: sequncias at agora usam incrementos que so primos entre si
AED (IST/DEEC)
39
AED (IST/DEEC)
40
Vantagens de Shellsort
rpido/eficiente
pouco cdigo
melhor mtodo para ficheiros pequenos e mdios
aceitvel para elevados volumes de dados
AED (IST/DEEC)
41
Exemplo de aplicao
Discusso da eficincia do algoritmo
Condicionada pela sequncia de ordenao utilizada
42
}
AED (IST/DEEC)
}
AED (IST/DEEC)
44
Item ITEMrand(void);
int ITEMscan(Item *);
void ITEMshow(Item);
void
void
void
void
randinit (Item
scaninit (Item
show (Item [],
sort (Item [],
AED (IST/DEEC)
[], int);
[], int *);
int, int);
int, int);
Item.h
double Item;
key(A) (A)
less(A, B) (key(A) < key(B))
exch(A, B) {Item t = A; A = B; B = t; }
compexch(A, B) if (less(B,A)) exch(A, B)
Interface para
tipo Item
Array.h
typedef
#define
#define
#define
#define
Interface para
tipo tabela de Items
45
Implementao
para tipo Item
(double)
AED (IST/DEEC)
46
<stdio.h>
<stdlib.h>
Item.h
Array.h
Implementao
para tipo tabela
de Items
AED (IST/DEEC)
47
rand
show
exch
etc, etc
AED (IST/DEEC)
48
mesmo que haja uma boa abstraco para operar sobre os objectos
ainda h a questo do custo
Porqu mov-los?
porque no alterar apenas referncia para a sua posio relativa?
AED (IST/DEEC)
49
AED (IST/DEEC)
50
ou seja
51
AED (IST/DEEC)
52
53
Algoritmos bsicos
alteraes simples
AED (IST/DEEC)
54
Ideia bsica
AED (IST/DEEC)
55
AED (IST/DEEC)
56