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 Decimal Binária Hexadecimal Dígitos (Caracteres) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 0, 1 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 (N – 1) 2 B Dígito * B Dígito * B Dígito * B1 (N – 1) Decimal Dígito * 10 Dígito * 100 Dígito * 10 (N – 1) Binária Dígito * 2 Dígito * 4 Dígito * 2 (N – 1) Hexadecimal Dígito * 16 Dígito * 256 Dígito * 16 1 Dígito * 1 Dígito * 1 Dígito * 1 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 1 2 3 4 5 6 7 8 9 10 Dado (Chave) 15 2 21 11 8 1 30 9 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 0 1 2 3 4 5 6 7 8 9 Elementos 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 0 1 2 3 4 5 6 7 8 9 Elementos 30, 10 21, 11, 1 2 15 6 8 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 1 2 3 4 5 6 7 8 9 10 Dado (Chave) 30 10 21 11 1 2 15 6 8 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 0 1 2 3 4 5 6 7 8 9 Elementos 1, 2, 6, 8, 9 10, 11, 15 21 30 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 1 2 3 4 5 6 7 8 9 10 Dado (Chave) 1 2 6 8 9 10 11 15 21 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