You are on page 1of 4

Classificao de Dados em

Tempo Linear

Classificao e Pesquisa de
Dados

Algoritmos de classificao em tempo linear exploram


determinadas propriedades do conjunto de dados a ser
ordenado

Aula 10
Classificao em Tempo Linear O(n): Counting Sort,
Radix Sort e Bucket Sort

UFRGS

Principais Algoritmos

INF01124

Counting sort

Radix sort

Bucket sort

Classificao de Dados em
Tempo Linear

Classificao de Dados por


Distribuio de Chaves Counting Sort
Princpio de classificao

Heapsort e Merge Sort apresentam desempenho de (nlog2n)

Quicksort tem custo mdio de O(nlog2n)


Estes algoritmos se baseiam em comparaes entre os valores de chaves
a serem ordenados e, portanto, so algoritmos de classificao por
comparao
Todo algoritmo de classificao por comparao est limitado por
(nlog2n). Portanto, Heapsort e Merge sort so assintoticamente timos
Existem algoritmos que apresentam custo linear (i.e., O(n))

n
n

Assume que cada um dos n elementos de entrada um inteiro no


intervalo de 1 a k
Quando k = O(n), o algoritmo executa em um tempo O(n)
Idia bsica: determinar para cada elemento x da entrada, o nmero
de elementos menores que x

Pequeno ajuste necessrio para suportar valores de chaves repetidos

Utiliza dois outros vetores auxiliares

O algoritmo estvel
2

Counting Sort
Exemplo (Cont.)

Procedimento Counting Sort

Proc counting-sort (A, B, k)


/* B: vetor que conter a sada ordenada;
k: tamanho do intervalo
*/
begin
for i 1 to k
/* inicializa acumuladores */
do C[i] 0;

C[A[j]] C[A[j]] - 1;
end

/* C[i] = numero de elementos iguais a i */

for i 2 to k
do C[i] C[i] + C[i-1];

/* C[i] = numero de elementos menores ou iguais a i */

C[A[j]] C[A[j]] - 1;
end
end

VERIFICAR

/* Armazena A[i] em sua posio final */

Counting Sort
Exemplo

for i 2 to k
do C[i] C[i] + C[i-1];
for j length[A] downto 1 do
begin

4 C

J=5

J=4

J=2

B 1 1

B 1 1

1
1

J=3

J=1

for i 1 to length[A]
do C[A[i]] C[A[i]] + 1;

/* Decrementa acum. p/ suportar chaves repetidas */

Proc counting-sort (A, B, k)


/* B: vetor que conter a sada ordenada;
k: tamanho do intervalo
*/
begin
for i 1 to k
do C[i] 0;

J=6

for j length[A] downto 1 do


begin
B[C[A[j]]] A[j];

for j length[A] downto 1 do


1
begin
J=7 B
B[C[A[j]]] A[j];

for i 1 to length[A]
do C[A[i]] C[A[i]] + 1;

3
4

B 1 1 3 3 4

8
8
8

C 2
C 1
C 1
C 1
C 0

C 0

4 6

57

C 0

Exerccios
1

2
1

Realize a ordenao do vetor abaixo usando counting sort,


mostrando os valores intermedirios para os vetores B e C:
1

B[C[A[j]]] A[j];
C[A[j]] C[A[j]] - 1;
end
end
6

Classificao de Dados por


Distribuio de Chaves Radix Sort

Procedimento Radix Sort

Princpio de classificao
n

n
n

Seja um conjunto de n chaves numricas, cada uma composta por d


dgitos decimais

Proc radix-sort (A, d)


begin
for i 1 to d do
use um algoritmo de sort estvel para ordenar o vetor A segundo o dgito i
end

Utiliza 10 escaninhos representando os dgitos de 0 a 9


Classifica os nmeros de acordo com o dgito menos significativo e
combina os resultados, preservando a ordem obtida
Utilizando o resultado do passo anterior como entrada, repete-se o
procedimento para a casa decimal menos significativa ainda no
visitada, at que todas tenham sido visitadas
So necessrios d passos para classificar o conjunto de n chaves
9

Classificao de Dados por


Distribuio de Chaves Radix Sort
n

11

Exerccios

essencial que os dgitos sejam classificados utilizando um algoritmo


estvel

Realize a ordenao dos elementos dos vetores abaixo usando o


radix sort:
278

BOI

329

720

720

329

827

SIM

457

355

329

355

501

COM

657

436

436

436

489

XIS

839

457

839

457

263

MEL

436

657

355

657

012

CEM

720

329

457

720

575

LAR

355

839

657

839

10

12

Classificao de Dados por


Distribuio de Chaves Bucket Sort

Procedimento Bucket Sort

Princpio de classificao
n

Assume que cada um dos n elementos de entrada foi gerado por um


processo randmico que distribui valores uniformemente no intervalo
[0,1)
Subdivide o intervalo [0,1) em n sub-intervalos (buckets) de mesmo
tamanho

Distribui os valores de entrada nos buckets

Para produzir a seqncia ordenada:

Proc bucket-sort (A)


begin
n length[A]
for i 1 to n
do insira A[i] na lista B[nA[i] ]
for i 0 to n-1
do ordene a lista B[i] usando insertion sort
concatene as listas B[0], B[1], , B[n-1], nesta ordem
end

Apesar do custo do algoritmo insertion sort ser O(n2), devido probabilidade de


um dado elemento cair em um bucket B[i] ser 1/n, o custo do algoritmo
O(n). Detalhes da prova podem ser encontrados no livro Introduction to
Algorithms, by Cormen et al.

w Dentro de cada bucket, os valores so classificados utilizando


insertion sort
w Visita-se os buckets em ordem crescente (de valores do subintervalo), listando-se os elementos em cada bucket visitado
13

15

Bucket Sort
Exemplo
B

Bucket i : [i/10, (i+1)/10)

.78

.17

.12

.17

.39

.21

.23

.26

.39

.72

.68

6
7
8

.94
.21
.12

.23

10

.68

4
5

.26

.72

.78

/
.94

14

16

You might also like