Você está na página 1de 26

UNIVERSIDADE LUTERANA DO BRASIL

COMUNIDADE EVANGÉLICA LUTERANA “SÃO PAULO”


Reconhecida pela Portaria Ministerial nº 681 de 07/12/89 – DOU de 11/12/89
Campus Torres

Ordenação de Dados por Distribuição


de Chaves
Estrutura de Dados II
Igor Casa Nova dos Santos
Uílson Zanetti Gomes
Mauricio Volkweis Astiazara
Henrique Oliveira

Professor Leonardo Pereira


Torres, Abril de 2002
Sumário
■ Introdução
■ 1 Origem
■ 2 Base
– 2.1 Princípio da Limitação de Dígitos
– 2.2 Princípio do Valor pela Posição
– 2.3 Aplicando os Dois Princípios
■ 3 Algoritmo
– 3.1 Código
– 3.2 Aplicação
■ 4 Vantagens e Desvantagens
■ Conclusão

2
Introdução
■ Existem diversos algoritmos utilizados para a
ordenação de dados
■ Cada um apresenta características
específicas, com vantagens e desvantagens
■ Veremos um destes algoritmos: ordenação
de dados por distribuição de chaves

3
1 Origem
■ Também conhecido como Radixsort,
Algoritmo das Raízes e Indexação Direta
■ Criado para máquinas de ordenação de
cartões perfurados
■ Resistiu ao tempo e foi utilizado em
computadores digitais

4
2 Base
■ Diferente dos outros métodos de ordenação
que usam comparação e troca
■ Se baseia em duas características do
sistema numérico arábico:
– Princípio da Limitação de Dígitos
– Princípio do Valor pela Posição

5
2.1 Princípio da Limitação de Dígitos
■ O número de dígitos (caracteres) usados
numa base numérica é limitado
■ A quantidade de números que podem
representar quando combinados é infinita
Base Numérica Dígitos (Caracteres)
Decimal 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Binária 0, 1
Hexadecimal 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

6
2.1 Princípio da Limitação de Dígitos
■ O algoritmo já “conhece” a ordem correta dos
dígitos da base numérica (decimal)
■ Logo, pode ordenar um vetor com dados de
no máximo um dígito

7
2.2 Princípio do Valor pela Posição
■ O valor de cada dígito muda de acordo com a
posição em que ocupa no número
■ Exemplos:
Base Valor do Dígito na Posição
N 3 2 1
(N – 1) 2 1
B Dígito * B Dígito * B Dígito * B Dígito * 1
(N – 1)
Decimal Dígito * 10 Dígito * 100 Dígito * 10 Dígito * 1
(N – 1)
Binária Dígito * 2 Dígito * 4 Dígito * 2 Dígito * 1
(N – 1)
Hexadecimal Dígito * 16 Dígito * 256 Dígito * 16 Dígito * 1
■ Logo, qualquer dígito à direita representa mais
que qualquer dígito à esquerda

8
2.3 Aplicando os Dois Princípios
■ Inicia-se ordenando os dados pelo dígito da posição
1 (menos significativo)
■ Para essa ordenação é usado um algoritmo baseado
no Princípio da Limitação de Dígitos
■ Passa-se então para a ordenação pelo dígito da
posição 2, depois 3 e assim por diante, até o número
máximo de dígitos que os dados podem ter

9
3 Algoritmo
■ Um exemplo de algoritmo em português estruturado e a sua
aplicação sobre um vetor exemplo
■ 3.1 Código
Programa Principal:
Início
Para cada posição começando pela 1 até a máxima que
as chaves podem ter {
Ordenar o vetor pelo dígito dessa posição;
}
Fim.

10
3.1 Código
Subrotina
Ordenar Vetor pelo Dígito da Posição X:
Início
Criar um vetor chamado Fila, da posição 0
até a 9, de filas;
Para cada elemento do Vetor {
F = Obter o dígito desse elemento na
Posição X;
Colocar esse elemento na Fila F;
}

11
3.1 Código
A Posição Atual do Vetor é o início;
Para Y = 0 até 9 {
Colocar cada elemento da Fila[Y] no
Vetor a partir da Posição Atual;
A Posição Atual do Vetor é o seu
próprio valor somado ao tamanho da
Fila[Y];
}
Fim;

12
3.2 Aplicação
■ Vetor exemplo a ser ordenado:
Posição Dado (Chave)
1 15
2 2
3 21
4 11
5 8
6 1
7 30
8 9
9 10
10 6 13
3.2 Aplicação
■ Passo 1:
Programa Principal:
Início
Para cada posição começando pela 1 até
a máxima que as chaves podem ter {
Ordenar o vetor pelo dígito dessa
posição;
}

14
3.2 Aplicação
■ Passo 2:
Subrotina
Ordenar Vetor pelo Dígito da Posição X:
Início
Criar um vetor chamado Fila, da posição
0 até a 9, de filas;

15
3.2 Aplicação
■ O Vetor de filas “Fila” criado:
Fila Elementos
0
1
2
3
4
5
6
7
8
9 16
3.2 Aplicação
■ Passo 3:
Para cada elemento do Vetor {
F = Obter o dígito desse elemento na
Posição X;
Colocar esse elemento na Fila F;
}

17
3.2 Aplicação
■ Ao fim do laço:
Fila Elementos
0 30, 10
1 21, 11, 1
2 2
3
4
5 15
6 6
7
8 8
9 9 18
3.2 Aplicação
■ Passo 4:
Para Y = 0 até 9 {
Colocar cada elemento da Fila[Y] no
Vetor a partir da Posição Atual;
A Posição Atual do Vetor é o seu
próprio valor somado ao tamanho da
Fila[Y];
}
Fim;

19
3.2 Aplicação
■ Vetor ordenado pelas unidades:
Posição Dado (Chave)
1 30
2 10
3 21
4 11
5 1
6 2
7 15
8 6
9 8
10 9 20
3.2 Aplicação
■ Passo 5:
– Com o fim da subrotina de ordenação por dígito,
volta-se ao programa principal e é encerrada a
primeira volta do laço descrito no Passo 1
– Segue-se o que foi descrito nos Passos 2 e 3,
mas com o parâmetro da rotina de ordenação por
dígito 2

21
3.2 Aplicação
■ Vetor ordenado pelas unidades e dezenas:
Fila Elementos
0 1, 2, 6, 8, 9
1 10, 11, 15
2 21
3 30
4
5
6
7
8
9 22
3.2 Aplicação
■ Passo 6:
– É repetido o processo do passo 4, que forma o
vetor novamente a partir das filas
– É o fim da subrotina e volta-se ao programa
principal
– Como foi atingido o número máximo de dígitos (2)
é o fim do laço e do programa

23
3.2 Aplicação
■ Vetor ordenado ao fim do programa:
Posição Dado (Chave)
1 1
2 2
3 6
4 8
5 9
6 10
7 11
8 15
9 21
10 30 24
4 Vantagens e Desvantagens
■ Utiliza pouco processamento (comparações)
em relação aos outros algoritmos
■ Rápido para dados com poucos dígitos

■ É necessário saber de antemão o número


máximo de dígitos dos dados
■ Os passos intermediários, como a separação
do dado em dígitos, podem usar mais
processamento que a própria ordenação.

25
Conclusão
■ Deve ser utilizado em situações específicas,
como por exemplo:
– Quando se sabe o antecipadamente o tamanho
máximo dos dados
– Quando o número de dígitos dos dados não é
muito grande
■ Se usado em situações genéricas a eficiência
pode não corresponder ao desejado

26

Você também pode gostar