Ordenação : Radixsort

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

description

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 - PowerPoint PPT Presentation

Transcript of Ordenação : Radixsort

Page 1: Ordenação : Radixsort

Ordenação: Radixsort

Algoritmos e Estruturas de Dados II

Page 2: Ordenação : Radixsort

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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?