1 / 19

Ordenação : Radixsort

Ordenação : Radixsort. Algoritmos e Estruturas de Dados II. Introdução. Até agora vimos métodos de ordenação que comparam chaves Esta é uma abordagem geral que funciona para qualquer tipo de chave Uma abordagem alternativa para ordenação é processar as chaves por partes

elana
Télécharger la présentation

Ordenação : Radixsort

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ordenação: Radixsort Algoritmos e Estruturas de Dados II

  2. Introdução • Até agora vimos métodos de ordenação que comparam chaves • Esta é uma abordagem geral que funciona para qualquer tipo de chave • Uma abordagem alternativa para ordenação é processar as chaves por partes • Por exemplo, começamos pelas primeiras letras do nome quando procuramos um nome num catálogo • Não precisamos comparar chaves

  3. Ideia • Quebrar uma chave em vários pedaços • Dígitos de um número em uma dada base (radix) • 312 tem os dígitos 3, 1 e 2 na base 10 • 312 tem os dígitos 100111000 na base 2 • “exemplo” tem 6 caracteres (base 256) • Ordenar de acordo com o primeiro pedaço • Números cujo dígito mais à esquerda começa com 0 vêm antes de números cujo dígito mais à esquerda é 1 • Podemos ordenar repetindo esse processo para todos os pedaços

  4. Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos existem de cada valor

  5. Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos existem de cada valor

  6. Radixsort – Ordenando um dígito Depois calcular a posição deles no vetor ordenado

  7. Radixsort – Ordenando um dígito E finalmente colocar os elementos em suas posições

  8. Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos existem de cada valor

  9. Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos existem de cada valor

  10. Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos existem de cada valor

  11. Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos existem de cada valor

  12. Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos existem de cada valor

  13. Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos existem de cada valor

  14. Radixsort – Ordenando o vetor • Repetimos o mesmo processo para o próximo dígito • Funciona por que o método do contador que usamos anteriormente é estável!

  15. Radixsort – Ordenando o vetor • Repetimos o mesmo processo para o próximo dígito • Funciona por que o método do contador que usamos anteriormente é estável!

  16. Radixsort void radix(int *v, int n, int base, intnum_digitos) { inti, j, w, count[base], d, idx; int *aux = (int *) malloc(n * sizeof(int)); for(w = 0; w < num_digitos; w++) { for(j = 0; j < base; j++) count[j] = 0; // zeracontador for(i = 0; i < n; i++) { // contadígitos d = digito(v[i], w, base); count[d]++; } // atéondevãooselementos de cadadígito? for(j = 1; j < base; j++) count[j] += count[j-1]; for(i = 0; i < n; i++) { // adicionanasposições d = digito(v[i], w, base); aux[ count[d-1] ] = v[i]; count[d-1]++; } for(i = 0; i < n; i++) v[i] = aux[i]; // retorna p/ v } }

  17. Radixsort – Análise • Nenhuma comparação • Inspeções de dígitos: • 2*n*num_digitos • Senum_digitosfor pequeno ou constante, então radixsort tem custo linear O(n) • Trocas: • n*num_digitos • Número de trocas também é O(n)

  18. Vantagens e desvantagens • Vantagens: • Estável • Não compara as chaves • Desvantagens: • Nem sempre é fácil otimizar a inspeção de dígitos • Depende do hardware • Só é bom se o número de dígitos for pequeno • Não funciona em qualquer tipo de chave • Ex: números romanos

  19. Exercícios Por que não usar o algoritmo de ordenação por seleção para identificar o k-ésimo menor elemento do vetor? Mesmo com o uso da estratégia da mediana, mostre um vetor de entrada que cai no pior caso do quicksort. Um vetor com elementos em ordem reversa é um heap? Mostre que o heapsort não é estável. Como seria a implementação do radixsortutilizando o TAD fila?

More Related