You are on page 1of 56

AED

Algoritmos e Estruturas de Dados


LEEC - 2005/2006

Algoritmos de Ordenao 1 parte

Porqu estudar algoritmos elementares


(de ordenao)
Razes de ordem prtica
Fceis de codificar e por vezes suficientes
Rpidos/Eficientes para problemas de dimenso mdia e por vezes os
melhores em certas circunstncias

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

Importante para compreenso das regras de "funcionamento"

AED (IST/DEEC)

Contexto e regras bsicas [1]


Objectivo
Estudar mtodos de ordenao de ficheiros de dados em que cada
elemento (item) caracterizado por uma chave ("key")
Chaves so usadas para controlar a ordenao
objectivo rearranjar os dados de forma a que as chaves estejam
ordenadas de forma pr-definida (numrica ou alfabtica, por
exemplo)

Opes em termos de implementao


macros ou subrotinas/funes?
compromisso entre desempenho, generalidade e simplicidade
utilizaremos uma mistura de ambos

AED (IST/DEEC)

Contexto e regras bsicas [2]


Metodologia
caractersticas especficas de cada item ou chave podem ser
diferentes mas conceito abstracto o mais importante
comearemos por estudar ordenao em tabelas
utilizaremos operaes abstractas nos dados: comparao, troca
alterar items para outro tipo (ex: vrgula flutuante) simples
typedef
#define
#define
#define
#define

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)

Tempo de execuo usualmente proporcional ao nmero de


comparaes nmero de movimentaes/trocas (ou ambos)
AED (IST/DEEC)

Nomenclatura [1]
Tipos de Algoritmos de Ordenao
no adaptativos: sequncia de operaes independente da ordenao
original dos dados
interessantes para implementao em hardware

adaptativos: sequncia de operaes dependente do resultado de


comparaes (operao "less")
a maioria dos que estudaremos

Parmetro de interesse o desempenho, i.e. tempo de execuo


algoritmos bsicos: N2 para ordenar N items
mas por vezes os melhores para N pequeno

algoritmos avanados: N log N para ordenar N items

Olharemos tambm para os recursos de memria necessrios


ordenao "in-place" ou utilizando memria adicional
AED (IST/DEEC)

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

Distino muito importante:


ordenao interna pode aceder a qualquer dado facilmente
ordenao externa tem de aceder a dados de forma sequencial (ou
em blocos)

Vamos estudar fundamentalmente ordenao interna

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

Exemplo de algoritmo indirecto:


se a chave for pequena e cada dado for "grande
(por exemplo o nome completo de um aluno, mais morada, nmero de
BI, etc)
nestes casos no convm estar a trocar os elementos
dispendioso

basta trocar a informao correspondente aos seus ndices


tabela de ndices/ponteiros em que o primeiro indica o menor elemento, etc

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);

Para cada algoritmo, "sort" tem nome apropriado


AED (IST/DEEC)

Ordenao por seleco - Selection Sort


Um dos mais simples. Algoritmo:
procurar menor elemento e trocar com o elemento na 1a posio
procurar 2o menor elemento e trocar com o elemento na 2a posio
proceder assim at ordenao estar completa
void selection (Item a[], int l, int r){
int i, j;
for (i = l; i < r; i++) {
int min = i;
for (j = i+1; j <= r; j++)
if (less(a[j], a[min])) min = j;
exch(a[i], a[min])
}

Ciclo
Ciclo
interior
exterior

AED (IST/DEEC)

10

Selection Sort - Exemplo de Aplicao


A S O R T

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

Selection Sort - Anlise


Ciclo interno apenas faz comparaes
troca de elementos feita fora do ciclo interno
cada troca coloca um elemento na sua posio final
nmero de trocas N-1 (porque no N?)

tempo de execuo dominado pelo nmero de comparaes!


Propriedade: Selection sort usa aproximadamente N2/2

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

Ordenao Sntese da Aula O1


Introduo ao problema da ordenao de dados
Simplicidade do problema facilita a compreenso de conceitos
chave em algoritmos
Problema de grande aplicao

Definio das regras base e interface de utilizao


Macros e operaes elementares relevantes

Definies e propriedades gerais


Ordenao por Seleo Select sort
Descrio
Exemplo de aplicao
Anlise de eficincia

AED (IST/DEEC)

13

Ordenao por insero - Insertion Sort


Ideia: considerar os elementos um a um e inseri-los no seu lugar
entre os elementos j tratados (mantendo essa ordenao)
ex: ordenar cartas de jogar
insero implica arranjar novo espao ou seja mover um nmero elevado
de elementos uma posio para a direita
inserir os elementos um a um comeando pelo da 1a posio
#define less(A, B) (key(A) < key(B))
#define exch(A, B) {Item t = A; A = B; B = t; }
#define compexch(A, B) if (less(B,A)) exch(A, B)

void insertion(Item a[], int l, int r){


int i, j;
for (i = l+1; i <= r; i++)
for (j = i; j > l; j--)
compexch (a[j-1], a[j]);
}
AED (IST/DEEC)

14

Insertion Sort - Comentrios


Elementos esquerda do ndice corrente esto ordenados
mas no necessariamente na sua posio final
podem ainda ter de ser deslocados para a direita para dar lugar a
elementos menores encontrados posteriormente

Implementao da ordenao por insero na pg. anterior


ineficiente
cdigo simples, claro mas pouco eficiente; pode ser melhorado
ilustra bom raciocnio:
encontrar soluo simples
estudar o seu funcionamento
melhorar desempenho atravs de pequenas transformaes

AED (IST/DEEC)

15

Insertion Sort - Melhorar desempenho


Demasiadas operaes de comparao/troca (compexch)
podemos parar se encontramos uma chave que no maior que a
do item a ser inserido (tabela est ordenada esquerda)
podemos sair do ciclo interno se less(a[j-1], a[j]) verdadeira

modificao torna o algoritmo adaptativo


aumenta desempenho aproximadamente por um factor de 2
Passa a haver duas condies para sair do ciclo
mudar para um ciclo while
remover instrues irrelevantes
compexch no o melhor processo de mover vrios dados uma
posio para a direita

AED (IST/DEEC)

16

Insertion Sort - Verso adaptativa


void insertion(Item a[], int l, int r){
int i, j;
for (i = l+1; i <= r; i++) {
Item v = a[i];
j = i;
while (j > l && less(v, a[j-1])) {
a[j] = a[j-1]; j--;
}
a[j] = v;
}
}

AED (IST/DEEC)

17

Insertion Sort - Exemplo de Aplicao


ASORTINGEXAMPLE
ASORTINGEXAMPLE
AOSRTINGEXAMPLE
AORSTINGEXAMPLE
AORSTINGEXAMPLE
AIORSTNGEXAMPLE
AINORSTGEXAMPLE
AGINORSTEXAMPLE
AEGINORSTXAMPLE
AEGINORSTXAMPLE
AAEGINORSTXMPLE
AAEGIMNOPRSTXLE
AAEGIMNOPRSTXLE
AAEGILMNOPRSTXE
AAEEGILMNOPRSTX
AAEEGILMNOPRSTX
AED (IST/DEEC)

18

Insertion Sort - Anlise


Propriedade: Insertion sort usa aproximadamente N2/4
comparaes e N2/4 pseudo-trocas (translaes ou
movimentos) no caso mdio e o dobro destes valores no
pior caso
Demonstrao: Fcil de ver graficamente; elementos abaixo da
diagonal so contabilizados (todos no pior caso)
Para dados aleatrios expectvel que cada elemento seja colocado
aproximadamente a meio para trs pelo que apenas metade dos
elementos abaixo da diagonal devem ser contabilizados

Factos: em certos casos Insertion sort pode ter bom


desempenho (a ver...)
AED (IST/DEEC)

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

Bubble Sort - Comentrios [1]


Movendo da direita para a esquerda no ficheiro de dados
quando o elemento mais pequeno encontrado na primeira passagem
sucessivamente trocado com todos sua esquerda
acaba por ficar na primeira posio

na segunda passagem o 2o elemento mais pequeno colocado na sua


posio e por diante
N passagens pelos dados so suficientes!

semelhante ao mtodo de seleco


tem mais trabalho para colocar cada elemento na sua posio final
todas as trocas sucessivas at chegar posio certa

AED (IST/DEEC)

21

Bubble Sort - Comentrios [2]


Algoritmo pode ser melhorado, tal como o algoritmo de
insero
cdigo muito semelhantes mas no igual
ciclo interno de Insertion Sort percorre a parte esquerda(ordenada) da
tabela
ciclo interno de Bubble Sort percorre a parte direita(no ordenada) da
tabela

no final de cada passagem podemos testar se houve mudanas

AED (IST/DEEC)

22

Bubble Sort - Exemplo de Aplicao


ASORT INGEXAMPLE
AASORT INGEXEMPL
AAESORT INGEXLMP
AAEESORT INGLXMP
AAEEGSORT INLMXP
AAEEG ISORTLNMPX
AAEEG ILSORTMNPX
AAEEG ILMSORTNPX
AAEEG ILMNSORTPX
AAEEG ILMNOSPRTX
AAEEG ILMNOPSRTX
AAEEG ILMNOPRSTX
AAEEG ILMNOPRSTX
AAEEG ILMNOPRSTX
AAEEG ILMNOPRSTX
AAEEG ILMNOPRSTX
AED (IST/DEEC)

23

Bubble Sort - Anlise


Propriedade: Bubble sort usa aproximadamente N2/2
comparaes e N2/2 trocas no caso mdio e no pior caso
Demonstrao: A i-sima passagem de Bubble Sort requer
N-i operaes de comparao/troca, logo a demonstrao
semelhante a Selection sort
Factos: Algoritmo pode depender criticamente dos dados se
for modificado para terminar quando no houver mais
trocas
se o ficheiro estiver ordenado, apenas um passo necessrio
se estiver em ordenao inversa ento na i-sima passagem so
precisas N-1 comparaes e trocas
caso mdio semelhante (anlise mais complexa)
AED (IST/DEEC)

24

Comparao dos algoritmos elementares


de ordenao [1]
Tempos de execuo quadrticos
Selection
Comparaes
Trocas

AED (IST/DEEC)

Insertion

Bubble

N2/2

N2/4

N2/2

N2/4

N2/2

25

Comparao dos algoritmos elementares


de ordenao [2]
Ficheiros com elementos grandes e pequenas chaves
Selection Sort linear no nmero de dados
N dados com tamanho M (palavras/words)
comparao - 1 unidade; troca - M unidades

N2/2 comparaes e NM custo de trocas


termo NM domina
custo proporcional ao tempo necessrio para mover os dados

Ficheiros quase ordenados


Insertion sort e Bubble sort so quase lineares
os melhores algoritmos de ordenao podem ser quadrticos neste
caso!

AED (IST/DEEC)

26

Comparao dos algoritmos elementares de


ordenao [3]

AED (IST/DEEC)

27

Ordenao Sntese da Aula O2


Ordenao por insero Insertion sort

Verso elementar
Verso adaptativa
Exemplo de aplicao
Anlise de Eficincia

Bubble sort Breve referncia


Descrio do algoritmo e anlise funcionamento
Exemplo de aplicao
Anlise de eficincia

Comparao dos trs primeiros algoritmos elementares


Em nmero de comparaes e trocas
Na evoluo da tabela durante a execuo exemplo grfico
AED (IST/DEEC)

28

Shellsort - Melhorar a eficincia [1]


Insertion sort lento: apenas envolve trocas entre items
adjacentes
se o menor item est no final da tabela, sero precisos N passos para o
colocar na posio correcta

Shellsort:
acelerar o algoritmo permitindo trocas entre elementos que esto
afastados
como?

AED (IST/DEEC)

29

Shellsort - Melhorar a eficincia [2]


Ideia: rearranjar os dados de forma a que tenham a propriedade
que olhando para cada h-simo elemento esto ordenados
dados dizem-se h-ordenados
equivalente a h sequncias ordenadas entreligadas (entrelaadas)

Usando valores de h grandes possvel mover elementos na


tabela grandes distncias o que torna mais fcil h-ordenar
mais tarde com h pequenos
usando este procedimento para qualquer sequncia de h's que termine
em 1 vao produzir um ficheiro ordenado
cada passo torna o prximo mais simples

AED (IST/DEEC)

30

Shellsort - Melhorar a eficincia [3]


Outra forma de ver o algoritmo:
a tabela dividida em parties, cada uma contendo os objectos de
ndice % h
exemplo: para uma tabela de 15 posies e h=4

ndices resto 0, i%4=0, so: 0, 4, 8, 12


ndices resto 1, i%4=1, so: 1, 5, 9, 13
ndices resto 2, i%4=2, so: 2, 6, 10, 14
ndices resto 3, i%4=3, so: 3, 7, 11, 15

dentro de cada partio feita uma ordenao por insero

Exemplo permite visualizar bem o algoritmo...

AED (IST/DEEC)

31

h-Ordenao - Exemplo: h=4


ASORTINGEXAMPLE
ASOREINGTXAMPLE
ASOREINGPXAMTLE

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

Implementao de Shellsort [1]


Possvel fazer melhor: sub-ficheiros so independentes
quando h-ordenamos os dados inserimos qualquer elemento entre
os do seu (h) sub-ficheiro movendo elementos maiores para a
direita
basta usar insertion code com incrementos/decrementos
de h em vez de 1

implementao de Shellsort usa um passo de Insertion sort pelo


ficheiro para cada incremento

Tabela no fica completamente ordenada depois da 1a


ordenao das vrias parties
necessrio repetir com uma srie de parties
isto , no basta escolher/usar um s h!
AED (IST/DEEC)

33

Shellsort - Exemplo de aplicao [1]

Parties
esto
entrelaadas

AED (IST/DEEC)

ASORTINGEXAMPLE
AIORTSNGEXAMPLE
AINRTSOGEXAMPLE
AINGTSOREXAMPLE
AINGESORTXAMPLE
AINGESORTXAMPLE
AIAGESNRTXOMPLE
AIAGESNMTXORPLE
AIAGESNMPXOMTLE
AIAGELNMPSORTXE
AIAGELEMPSNRTXO
34

Implementao de Shellsort [2]


Soluo bvia: para cada h usar Insertion Sort
independentemente em cada um dos h sub-ficheiros
int h = 4;
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)

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)

na prtica utilizam-se sequncias que decrescem geometricamente


para que o nmero de incrementos seja logartmico
a sequncia ptima no foi ainda descoberta (se que existe)
anlise do algoritmo desconhecida
ningum encontrou a frmula que define a complexidade
complexidade depende da sequncia
AED (IST/DEEC)

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

Shellsort - Exemplo de aplicao [2]


ASORTINGEXAMPLE
ASORTINGEXAMPLE
AEORTINGEXAMPLS
AEORTINGEXAMPLS
AEORTINGEXAMPLS
AENRTIOGEXAMPLS
AENGTIOREXAMPLS
AENGEIORTXAMPLS
AENGEIORTXAMPLS
AEAGEINRTXOMPLS
AEAGEINMTXORPLS
AEAGEINMPXORTLS
AEAGEINMPLORTXS
AEAGEINMPLORTXS

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

Shellsort faz menos do que O(N log2 N) comparaes para os


incrementos
1, 2, 3, 4, 6, 9, 8, 12, 18, 27, 16, 24, 36, 54, 81

Shellsort um exemplo de um algoritmo simples cuja


anlise complicada:

sequncia ptima, e anlise completa no so conhecidos!


Algum consegue encontrar uma sequncia que bata
1, 2, 7, 21, 48, 112, 336, ...??

AED (IST/DEEC)

39

Shellsort - Exemplo Grfico


Graficamente parece que um elstico, preso nos cantos
puxa os pontos para a diagonal

AED (IST/DEEC)

40

Vantagens de Shellsort

rpido/eficiente
pouco cdigo
melhor mtodo para ficheiros pequenos e mdios
aceitvel para elevados volumes de dados

Muito utilizado na prtica, embora dificil de compreender!

AED (IST/DEEC)

41

Ordenao Sntese da Aula O3


Shellsort
Apresentado como uma variante de acelerao do
Insertion sort
Descrio
Implementao
Sequncias de ordenao

Exemplo de aplicao
Discusso da eficincia do algoritmo
Condicionada pela sequncia de ordenao utilizada

Exemplo grfico da evoluo da tabela


Vantagens relativamente a outros algoritmos
AED (IST/DEEC)

42

Ordenao de outros tipos de dados [1]


Algoritmos estudados so independentes do tipo de dados
necessrio o interface apropriado e a implementao correspondente
#include <stdlib.h>
main (int argc, char *argv[])
{
int N = atoi (argv[1]), sw = atoi (argv[2]);
int *a = malloc (N * sizeof(int));
if (sw)
randinit(a, N);
else
scaninit(a, &N);
sort (a, 0, N-1);
show (a, 0, N-1);

}
AED (IST/DEEC)

for (i = 0; i < N; i++)


a[i] = 1000 * (1.0*rand()/RAND_MAX);
while (scanf(%d, &a[N]) == 1) N++;
for (i = 0; i < N; i++)
printf(%3d, a[i]);
printf(\n);
43

Ordenao de outros tipos de dados [2]


Algoritmos estudados so independentes do tipo de dados
necessrio o interface apropriado e a implementao correspondente
#include <stdlib.h>
#include Item.h
#include Array.h
main (int argc, char *argv[]){
int N = atoi (argv[1]), sw = atoi (argv[2]);
Item *a = malloc (N * sizeof(Item));
if (sw)
randinit(a, N);
else
scaninit(a, &N);
sort (a, 0, N-1);
show (a, 0, N-1);

}
AED (IST/DEEC)

44

Ordenao de outros tipos de dados [3]


Definio do interface
o tipo apropriado e as funes para sua manipulao

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

Ordenao de outros tipos de dados [4]


Implementao do interface
Implementao das funes que operam sobre os dados
#include <stdio.h>
#include <stdlib.h>
#include Item.h
double ITEMrand(void){
return 1.0 * rand() / RAND_MAX;
}

Implementao
para tipo Item
(double)

int ITEMscan(double *x){


return scanf(%lf, x);
}
void ITEMshow(double x){
printf(%7.5lf , x);
}

AED (IST/DEEC)

46

Ordenao de outros tipos de dados [5]


Implementao do interface
Implementao das funes que operam sobre os dados
#include
#include
#include
#include

<stdio.h>
<stdlib.h>
Item.h
Array.h

void randinit(Item a[], int N){


int i;
for (i = 0; i < N; i++) a[i] = ITEMrand();
}

void scaninit(Item a[], int *N){


int i =0;;
for (i = 0; i < *N; i++)
if (ITEMscan(&a[i]) == EOF) break;
*N = i;
}

Implementao
para tipo tabela
de Items

void show(Item a[], int l, int r){


int i;
for (i = l; i <= r; i++) ITEMshow(a[i]);
printf(\n);
}

AED (IST/DEEC)

47

Ordenao de outros tipos de dados [6]


Para qualquer tipo de dados
apenas alterar o interface
reescrever as funes que operam sobre os objectos

rand
show
exch
etc, etc

algoritmos e rotinas de ordenao (sorting) no necessitam de


qualquer alterao

AED (IST/DEEC)

48

Ordenao por ndices [1]


Suponha-se que os objectos a ordenar so strings (vectores
de caracteres):
funes que operam sobre os dados precisam de ter em conta a
questo da alocao de memria para strings
quem deve ser responsvel pela gesto desta memria?
e se os objectos so "grandes"? Comparar e mover os objectos
pode ser dispendioso!
imagine que cada objecto o nome completo de um aluno (ou que
toda a sua informao: nome, morada, etc)

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

Ordenao por ndices [2]


Soluo 1:
dados numa tabela data[0], ..., data[N-1]
usar uma segunda tabela, a[.], apenas de ndices
inicializado de forma a que a[i] = i, i = 0, ..., N-1

objectivo rearranjar a tabela de ndices de forma a que a[0]


aponte para o objecto com a menor chave, etc
objectos so apenas acedidos para comparao

Rotinas de ordenao apenas acedem aos dados atravs de


funes de interface:, less, exch, etc
apenas estas tm de ser reescritas

AED (IST/DEEC)

50

Ordenao por ndices - Exemplo


Suponha os seguintes dados: data = [rui, carlos, luis]
usamos uma tabela, de ndices a = [ 0,
1,
2]
1o passo: comparar data[a[1]] com data[a[0]]:
pelo que h troca de a[1] com a[0]:
2o passo: comparar data[a[2]] com data[a[1]]:
pelo que h troca de a[2] com a[1]:
3o passo: comparar data[a[1]] com data[a[0]]:
pelo que no h troca

carlos < rui


a = [ 1, 0, 2 ]
rui < luis
a = [ 1, 2, 0 ]
carlos < luis

Os valores ordenados so portanto data[a[0]], data[a[1]] e data[a[2]]

ou seja

carlos < luis < rui

(de forma encapotada usmos uma espcie de Insertion sort)


AED (IST/DEEC)

51

Ordenao por ponteiros


Outra soluo a tabela de ndices conter de facto
ponteiros para os dados
mais geral pois os ponteiros podem apontar para qualquer lado
items no precisam de ser membros de uma tabela
nem de ter todos o mesmo tamanho

depois da ordenao, acesso sequencial tabela de ponteiros


devolve os elementos ordenados

um exemplo a funo qsort, do C, que implementa o


algoritmo quicksort (estudaremos adiante)

AED (IST/DEEC)

52

Ordenao por ponteiros ou ndices


No-intrusiva em relao aos dados
pode ser efectuada se os dados forem apenas de leitura

Possvel efectuar ordenao em chaves mltiplas


ex: listagens de alunos, com nome, nmero e nota

Evita o custo de mover/trocar os items


pode ser elevado se estes forem grandes quantidades de
informao
mais eficiente em problemas com dados grandes e chaves
pequenas

E se for preciso retornar os dados ordenados?


ordenar por ndice/ponteiro
fazer permutaes in-situ (como?)
AED (IST/DEEC)

53

Ordenao de listas ligadas


Semelhante a ordenao de tabelas
funes de interface diferentes
necessrio trabalhar com ponteiros e no apenas com ndices

Trocas podem no ser possveis


elementos podem ser acedidos por outras estruturas de dados
trocam-se apenas os ponteiros
inseres so na verdade mais simples
no preciso mover elementos para a direita, apenas ajustar dois
ponteiros

Algoritmos bsicos
alteraes simples

AED (IST/DEEC)

54

Exerccio - usar Selection Sort para


ordenar uma lista ligada
Estruturas de Dados:
lista de entrada
lista de sada: dados colocados na sua posio final
ponteiros adicionais

Ideia bsica

procurar maior elemento na lista


manter ponteiro para o anterior
retir-lo da lista de entrada
introduzi-lo no incio da lista de sada

Implemente como exemplo!

AED (IST/DEEC)

55

Ordenao Sntese da Aula O4


Ordenao de outros tipos de dados
Implementaes estudadas at aqui assumiam ordenao de
inteiros
Definio da interface apropriada
Prottipos de funes elementares
Definio dos dados

Para evitar mover grandes quantidades de dados


Ordenao por ndices
Ordenao por ponteiros

Ordenao em listas ligadas


Referncia s alteraes a introduzir nos algoritmos analisados
Ao nvel dos dados de entrada
Ao nvel da interface

AED (IST/DEEC)

56

You might also like