Vous êtes sur la page 1sur 31

Ordenao: Introduo e

mtodos elementares
Algoritmos e Estruturas de Dados II

Ordenao


Objetivo:
Rearranjar os itens de um vetor ou lista de modo que
suas chaves estejam ordenadas de acordo com
alguma regra

Estrutura:
typedef int chave_t;
struct item {
chave_t chave;
/* outros componentes */
};

Critrios de Classificao


Localizao dos dados:




Ordenao interna


Todas os dados esto em memria principal (RAM)

Ordenao externa



Memria principal no cabe todos os dados


Dados armazenados em memria secundria (disco)

Critrios de Classificao


Estabilidade:


Mtodo estvel se a ordem relativa dos registros com


a mesma chave no se altera aps a ordenao.

Adams

Adams

Adams

Black

Smith

Smith

Brown

Washington

Black

Jackson

Jackson

Jackson

Jones

Black

Washington

Smith

White

White

Thompson

Wilson

Wilson

Washington

Thompson

Brown

White

Brown

Jones

Wilson

Jones

Thompson

D
4

Critrios de Classificao


Adaptabilidade:



Um mtodo adaptvel quando a sequencia de


operaes realizadas depende da entrada
Um mtodo que sempre realiza as mesmas operaes,
independende da entrada, no adaptvel.

Critrios de Classificao


Uso da memria:


In place: ordena sem usar memria adicional ou


usando uma quantidade constante de memria
adicional
Alguns mtodos precisam duplicar os dados

Critrios de Classificao


Movimentao dos dados:




Direta: estrutura toda movida


// struct item a;
// struct item b;
struct item aux = a;
a = b;
b = aux;

Indireta: apenas as chaves so acessadas e ponteiros


para as estruturas so rearranjados
// struct item *a;
// struct item *b;
struct item *aux = *a;
a = b;
b = aux;

Critrios de Avaliao


Seja n o nmero de registros em um vetor,


considera-se duas medidas de complexidade:
Nmero de comparaes C(n) entre as chaves
Nmero de trocas ou movimentaes M(n) de itens




#define troca(A, B) {struct item c = A; A = B; B = c;}


void ordena(struct item *v, int n) {
int i, j;
for(i = 0; i < n-1; i++) {
for(j = n-1; j > i; j--) {
if(v[j-1].chave > v[j].chave) /* comparaes */
troca(v[j-1], v[j]); /* trocas */
}
}
}
8

Ordenao por Seleo






Procura o n-simo menor elemento do vetor


Troca do n-simo menor elemento com o
elemento na n-sima posio
Repete at ter colocado todos os elementos em
suas posies
Elementos so movimentados apenas uma vez

Ordenao por Seleo


void selecao(struct item *v, int n){
int i, j, min;
for(i = 0; i < n - 1; i++) {
min = i;
for(j = i + 1 ; j < n; j++) {
if(v[j].chave < v[min].chave)
min = j;
}
troca(v[i], v[min]);
}
}

10

Ordenao por Seleo: Complexidade




Comparaes C(n):
C(n) =

n 2

n 2

n 2

n 2

i =0

i =0

i =0

i =0

(n i 1) = n i 1

(n 2)(n 1)
= n(n 1)
( n 1)
2
n2 n
=
= O(n 2 )
2


Movimentaes M(n):

M (n) = 3(n 1)

11

Ordenao por Seleo




Vantagens:


Custo linear no tamanho da entrada para o nmero de


movimentos de registros a ser utilizado quando h
registros muito grandes

Desvantagens:


No adaptvel


No importa se o arquivo est parcialmente ordenado

Algoritmo no estvel

12

Ordenao por Insero




Algoritmo utilizado pelo jogador de cartas





Jogador mantm as cartas em sua mo ordenadas


Quando compra ou recebe uma nova carta, o jogador
encontra qual posio ela deve ocupar em sua mo

Implementao para vetores:




Mantemos os elementos entre zero e i-1 ordenados







Note que o arranjo entre formado por um elemento est


ordenado, por definio

Achamos a posio do i-simo elemento e inserimos


ele entre os i-1 que j estavam ordenados
O programa repete esse passo at ordenar todos os
elementos
13

Mtodo Insero

14

Ordenao por Insero


void insercao(struct item *v, int n) {
int i, j;
struct item aux;
for(i = 1; i < n; i++) {
for(j = i; j >= 0; k--) {
if(v[j-1].chave > v[j].chave) {
troca(v[j-1], v[j]);
}
}
E
X
}
E
X
}

X
15

Ordenao por Insero Melhorado


void insercao(struct item *v, int n) {
int i, j;
struct item aux;
for(i = 1; i < n; i++) {
aux = v[i];
j = i - 1;
while((j >= 0) && (aux.chave < v[j].chave))
v[j + 1] = v[j];
j--;
E
X
E
M
}
E
X
E
M
v[j + 1] = aux;
E
E
X
M
}
E
E
M
X
}

X
16

Ordenao por Insero: Complexidade




Comparaes C(n):


Anel interno: i-sima iterao, valor de Ci






melhor caso: Ci = 1
pior caso: Ci = i
caso mdio: Ci = (1 + 2 + 3 + ... + i) / i

1 i
1 i (i + 1) i + 1
Ci = k =
=
i k =1
i 2
2


Para o caso mdio, assumimos que todas as


permutaes de entrada so igualmente provveis.

17

Ordenao por Insero: Complexidade




Comparaes C(n):


Anel externo:
n 1

C
i =1

Complexidade total:


Melhor caso (itens j esto ordenados)

C (n) =

n 1

1 = n 1 = O (n)
i =1

Pior caso (itens em ordem reversa):

( n 1)( n ) n 2 n
C (n) = i =
=
= O (n 2 )
2
2
2
i =1
n 1

18

Ordenao por Insero: Complexidade




Comparaes C(n):


Caso mdio:

C (n) =

n 1

i =1

n 1
i + 1 1 n 1
1 n ( n 1)

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

i =1

n2 n n 1 n2 n 1
+
=
+ = O (n 2 )
=
4
4 2
4 2

19

Ordenao por Insero: Exemplos




Melhor Caso:
1

Pior Caso:
6

6
20

Ordenao por Insero




Vantagens:





Lao interno eficiente, insero adequado para


ordenar vetores pequenos
o mtodo a ser utilizado quando o arquivo est
quase ordenado
um bom mtodo quando se deseja adicionar poucos
itens a um arquivo ordenado, pois o custo linear
O algoritmo de ordenao por insero estvel

Desvantagens:



Nmero de comparaes tem crescimento quadrtico


Alto custo de movimentao de elementos no vetor
21

Ordenao pelo Mtodo da Bolha




Ideia



Passa no arquivo e troca elementos adjacentes que


esto fora de ordem
Repete esse processo at que o arquivo esteja
ordenado

Algoritmo




Compara dois elementos adjacentes e troca de


posio se estiverem fora de ordem
Quando o maior elemento do vetor for encontrado, ele
ser trocado at ocupar a ltima posio
Na segunda passada, o segundo maior ser movido
para a penltima posio do vetor, e assim
sucessivamente
22

Ordenao pelo Mtodo da Bolha


E

1 passada

2 passada

23

Ordenao pelo Mtodo da Bolha


void bolha(struct item *v, int n) {
int i, j;
for(i = 0; i < n-1; i++) {
for(j = 1; j < n-i; j++) {
if(v[j].chave < v[j-1].chave)
troca(v[j-1], v[j]);
}
}
}

24

Ordenao pelo Mtodo da Bolha


void bolha(struct item *v, int n) {
int i, j;
for(i = 0; i < n-1; i++) {
for(j = 1; j < n-i; j++) {
if(v[j].chave < v[j-1].chave)
troca(v[j-1], v[j]);
}
}
}
E

X
25

Ordenao pelo Mtodo da Bolha:


Complexidade
void bolha(struct item *v, int n) {
int i, j;
for(i = 0; i < n-1; i++) {
for(j = 1; j < n-i; j++) {
if(v[j].chave < v[j-1].chave)
troca(v[j-1], v[j]);
}
n 2 ni
n 2
}
C(n) =
1 = (n i 1) =
}
i = 0 j =1
i =0

= n(n 1)
=

n 2

n 2

n 2

i =0

i =0

i =0

n i 1

(n 2)(n 1)
(n 1)
2

n2 n
= O(n 2 )
2

26

Ordenao pelo Mtodo da Bolha:


Complexidade
 Movimentaes M(n):


Pior caso (elementos em ordem decrescente):

n2 n
= O(n2 )
M(n) = 3 =3 (n i 1) = 3
2
i = 0 j =1
i =0
n 2 ni

n 2

27

Ordenao pelo Mtodo da Bolha




Vantagens



Algoritmo simples
Algoritmo estvel

Desvantagens



No adaptvel
Muitas trocas de itens

28

Exerccios
1.

2.

3.

4.

D um exemplo de um vetor com N elementos que


maximiza o nmero de vezes que o mnimo
atualizado no mtodo de ordenao seleo.
Mostre um exemplo de entrada que demonstra que o
mtodo de ordenao seleo no estvel.
O mtodo da bolha no adaptvel, altere o cdigo
para que ele se torne adaptvel.
Qual dos mtodos: bolha, insero e seleo executa
menos comparaes para um vetor de entrada
contendo valores idnticos.

29

Variao Bolha: Ordenao Par-mpar


void ParImpar(struct item *v, int n) {
int ordenado = 0;
while(!ordenado) {
ordenado = 1;
for(int i = 0; i < n-1; i += 2)
if(v[i] > v[i+1]) {
troca(v[i], v[i+1]);
ordenado = 0;
}
for(int i = 0; i < n-1; i += 2)
if(a[i] > a[i+1]) {
troca(v[i], v[i+1]);
ordenado = 0;
}
}
}
30

Visualizao de Algoritmos de Ordenao




http://www.sorting-algorithms.com

31

Vous aimerez peut-être aussi