Você está na página 1de 3

Estrutura de Dados 2 - Aula 06 - Algoritmos de ordenao de

complexidade de tempo linear

1 Limite inferior para ordenaes por comparaes

Em um algoritmo de ordenao por comparao, utilizamos apenas comparaes para determinar a ordem dos
elementos. Por exemplo, considere que desejamos ordenar uma sequncia com trs elementos: < a1 , a2 , a3 >.
Por se tratar de uma sequncia pequena, podemos realizar a ordenao comparando, manualmente, os trs
elementos. Realizando o mapeamento de todos os resultados possveis, obtemos a rvore de deciso apresentada
na Figura1. Em cada n da rvore da Figura 1, temos ai : aj representando a comparao entre os elementos
ai e aj . Vamos considerar que todas as comparaes tm a forma ai aj . Ento, quando ai aj seguimos a
rvore de deciso para o ramo esquerda. Em caso contrrio, seguimos a rvore para o ramo direita.
a1 : a2
>

a2 : a3 a1 : a3
> >

< a1 , a2 , a3 > a1 : a3 < a2 , a1 , a3 > a2 : a3


> >

< a1 , a3 , a2 > < a3 , a1 , a2 > < a2 , a3 , a1 > < a3 , a2 , a1 >

Figura 1: rvore de deciso para ordenao de 3 elementos.

Os algoritmos de ordenao vistos at agora so:


Buble sort;
Insertion sort;
Mergesort;
Heapsort;
Quicksort.
Todos eles so algoritmos de ordenao por comparao. Todos esses algoritmos possuem limite assinttico
inferior igual a (n log n).
Pode existir algoritmos mais ecientes?
A resposta sim! Desde que algumas condies sejam satisfeitas:
A entrada possua caractersticas especiais;
Algumas restries sejam respeitadas;
O algoritmo no seja puramente baseado em comparaes;
A implementao seja feita de forma adequada.
Os algoritmos que veremos agora possuem complexidade de tempo linear, ou seja, O(n). So eles:
Counting sort (ou algoritmo de contagem);
Radix sort;
Bucket sort.

1
2 Counting Sort - Ordenao por contagem

O algoritmo Counting Sort considera que cada elemento da entrada um inteiro de 1 a k. Quando k igual
quantidade de elementos da sequncia de entrada, ou seja, n, a ordenao demandar um tempo de O(n).
A ideia do algoritmo contar quantos elementos so menores que cada elemento x da entrada. Com tal
informao, possvel inserir o elemento x em sua posio correta no vetor ordenado.
Para ordenar um vetor de entrada A, o algoritmo utiliza:
um vetor C , com k posies, para armazenar a contagem de elementos menores que cada valor x
[1, . . . , k];
um vetor B , com n posies, para armazenar a sequncia de inteiros ordenada.

1 Algoritmo CountingSort (A [ ] , k , n : i n t e i r o ) : B [ ] : i n t e i r o .
2 VAR
3 i : inteiro ;
4 Incio :
5 Para i = 0 . . . k : +1 , faa :
6 C[ i ] = 0 ;
7 FimPara
8
9 // Inicializamos os contadores C[ i ] .
10
11 Para i = 1 . . . n : +1 , faa :
12 C[A[ i ] ] = C[A[ i ] ] + 1 ;
13 FimPara
14
15 // Agora C [ i ] contem o no . de e l e m e n t o s com v a l o r i .
16
17 Para i = 2 . . . k : +1 , faa :
18 C[ i ] = C[ i ] + C[ i 1];
19 FimPara
20
21 // Agora C [ i ] contem o no . de elementos m e n o r e s ou iguais a i .
22
23 Para faa
i = n . . . 1 : 1 , :
24 B[C[A[ i ] ] ] = A[ i ] ;
25 C[A[ i ] ] = C[A[ i ] ] 1 ;
26 FimPara
27
28 // Temos em B a lista ordenada .
29
30 retorna B;
31 Fim .
Questes:
Quanto tempo o algoritmo Counting Sort precisa para ordenar uma sequncia com n elementos?
O algoritmo Counting Sort um algoritmo de ordenao estvel?

3 Radix sort

O algoritmo Radix Sort foi utilizado nas mquinas de ordenar cartes. A ideia deste algoritmo ordenar uma
lista de nmeros utilizando os dgitos, de forma que a ordenao comea pelos dgitos menos signicativos.
Para que o algoritmo funcione corretamente, necessrio que o algoritmo de ordenao dos dgitos seja estvel.
Geralmente, utilizamos este algoritmo para ordenar registros cuja chave constituda de vrios campos.
Restries:
Pressupe que as chaves possuem limite no valor e no tamanho (nmero de dgitos);
Ordena em funo dos dgitos, a partir do menos signicativo;
necessrio utilizar um segundo algoritmo de ordenao estvel para realizar a ordenao de cada dgito.
<Mostrar exemplo>
1 Algoritmo CountingSort (A [ ] , d : i n t e i r o ) :
2 VAR
3 i : inteiro ;
4 Incio :
5 Para i = 0 . . . d : +1 , faa :
6 U t i l i z e um a l g o r i t m o de o r d e n a o estvel para ordenar o vetor A p e l o i e s i m o d g i t o ;
7 FimPara
8 Fim .

4 Bucket sort

Restries:
Assume-se que a entrada consistem em elementos distribudos uniformemente no intervalo [0, 1);

A ideia do Bucket Sort dividir o intervalo [0, 1) em n subintervalos de mesmo tamanho (baldes), e ento
distribuir os n nmeros nos baldes;
Pela caracterstica da entrada (distribuio uniforme), no se espera que muitos nmeros caiam em cada
balde.
Para se produzir a sada ordenada, basta ordenar os elementos em cada balde e, posteriormente, listar os
elementos nos baldes em ordem.
<Mostrar exemplo>
Qual a complexidade deste algoritmo?
Vimos trs algoritmos de ordenao de complexidade de tempo linear (O(n)), que so melhores que os
algoritmos de ordenao por comparao (complexidade de tempo O(n log n)). Note que, apesar de apresentarem
melhor ecincia que os algoritmos de ordenao por comparao, os algoritmos vistos nesta aula nem sempre
so a melhor escolha, pois todos os trs pressupem algo sobre os dados de entrada a serem ordenados.

Você também pode gostar