Download - Ordenação : Radixsort
![Page 1: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/1.jpg)
Ordenação: Radixsort
Algoritmos e Estruturas de Dados II
![Page 2: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/2.jpg)
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
![Page 3: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/3.jpg)
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
![Page 4: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/4.jpg)
4
Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos
existem de cada valor123 142 087 263 233 014 132 Digit
oContador
0 01 02 03 04 05 06 07 08 09 0
![Page 5: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/5.jpg)
5
Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos
existem de cada valor123 142 087 263 233 014 132 Digit
oContador
0 01 02 23 34 15 06 07 18 09 0
![Page 6: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/6.jpg)
6
Radixsort – Ordenando um dígito Depois calcular a posição deles no vetor
ordenado123 142 087 263 233 014 132 Di
gC Posica
o0 0 01 0 02 2 03 3 24 1 55 0 06 0 07 1 68 0 09 0 0
![Page 7: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/7.jpg)
7
Radixsort – Ordenando um dígito E finalmente colocar os elementos em suas
posições123 142 087 263 233 014 132
123Dig
C Posicao
0 0 01 0 02 2 03 3 34 1 55 0 06 0 07 1 68 0 09 0 0
![Page 8: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/8.jpg)
8
Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos
existem de cada valor123 142 087 263 233 014 132142 123
Dig
C Posicao
0 0 01 0 02 2 13 3 34 1 55 0 06 0 07 1 68 0 09 0 0
![Page 9: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/9.jpg)
9
Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos
existem de cada valor123 142 087 263 233 014 132142 123 087
Dig
C Posicao
0 0 01 0 02 2 13 3 34 1 55 0 06 0 07 1 78 0 09 0 0
![Page 10: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/10.jpg)
10
Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos
existem de cada valor123 142 087 263 233 014 132142 123 263 087
Dig
C Posicao
0 0 01 0 02 2 13 3 44 1 55 0 06 0 07 1 78 0 09 0 0
![Page 11: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/11.jpg)
11
Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos
existem de cada valor123 142 087 263 233 014 132142 123 263 233 087
Dig
C Posicao
0 0 01 0 02 2 13 3 54 1 55 0 06 0 07 1 78 0 09 0 0
![Page 12: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/12.jpg)
12
Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos
existem de cada valor123 142 087 263 233 014 132142 123 263 233 014 087
Dig
C Posicao
0 0 01 0 02 2 13 3 54 1 65 0 06 0 07 1 78 0 09 0 0
![Page 13: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/13.jpg)
13
Radixsort – Ordenando um dígito Para isso iremos contar quantos elementos
existem de cada valor123 142 087 263 233 014 132142 132 123 263 233 014 087
Dig
C Posicao
0 0 01 0 02 2 13 3 54 1 65 0 06 0 07 1 78 0 09 0 0
![Page 14: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/14.jpg)
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!
123 142 087 263 233 014 132142 132 123 263 233 014 087014 123 132 233 142 263 087
![Page 15: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/15.jpg)
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!
123 142 087 263 233 014 132142 132 123 263 233 014 087014 123 132 233 142 263 087014 087 123 132 142 233 263
![Page 16: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/16.jpg)
16
Radixsortvoid radix(int *v, int n, int base, int num_digitos) {int i, 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; // zera contador for(i = 0; i < n; i++) { // conta dígitos d = digito(v[i], w, base); count[d]++; } // até onde vão os elementos de cada dígito? for(j = 1; j < base; j++) count[j] += count[j-1]; for(i = 0; i < n; i++) { // adiciona nas posiçõ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 }}
![Page 17: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/17.jpg)
17
Radixsort – Análise Nenhuma comparação Inspeções de dígitos:
2*n*num_digitos Se num_digitos for pequeno ou constante,
então radixsort tem custo linear O(n) Trocas:
n*num_digitos Número de trocas também é O(n)
![Page 18: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/18.jpg)
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
![Page 19: Ordenação : Radixsort](https://reader036.vdocuments.com.br/reader036/viewer/2022082401/56815c37550346895dca2311/html5/thumbnails/19.jpg)
19
Exercícios1. Por que não usar o algoritmo de
ordenação por seleção para identificar o k-ésimo menor elemento do vetor?
2. Mesmo com o uso da estratégia da mediana, mostre um vetor de entrada que cai no pior caso do quicksort.
3. Um vetor com elementos em ordem reversa é um heap?
4. Mostre que o heapsort não é estável.5. Como seria a implementação do radixsort
utilizando o TAD fila?