Menu
Coddy logo textTech

Radix Sort

Última atualização

Radix sort é uma ordenação sem comparações para inteiros. Em vez de comparar valores, ele ordena os números dígito a dígito. A versão do dígito menos significativo (LSD) processa primeiro o dígito das unidades, depois as dezenas e então as centenas, usando um counting sort estável em cada dígito. Como cada passagem é estável, uma vez processado o dígito mais significativo o vetor inteiro fica ordenado. Pressione reproduzir acima para ver cada passagem de dígitos reordenar as barras.

Radix sort roda em tempo O(d·(n + k)), onde d é o número de dígitos e k é a base (10 aqui). Para inteiros de largura fixa isso é praticamente linear - pode superar as ordenações por comparação O(n log n) - mas só funciona com dados que possam ser divididos em dígitos ou chaves.

Complexidade de tempo e espaço

CasoComplexidadeNotas
TempoO(d·(n + k))d dígitos, base k (linear para d fixo)
EspaçoO(n + k)Vetor de saída + contagens de dígitos
EstávelSimCada passagem de dígito é um counting sort estável
Comparação?NãoOrdena por dígito, não comparando valores
Funciona comInteiros/chavesNão com objetos comparáveis gerais

Passo a passo

PassoO que acontece
1Encontrar o valor máximo para saber quantos dígitos processar.
2Começar pelo dígito menos significativo (as unidades).
3Ordenar o vetor de forma estável por esse dígito usando counting sort.
4Passar para o próximo dígito mais significativo.
5Repetir até processar todas as posições de dígitos.

Exemplo resolvido

Ordenando [170, 45, 75, 90, 2, 24, 66]:

PassagemVetorAção
Início[170, 45, 75, 90, 2, 24, 66]O máximo é 170, então são necessárias três passagens de dígitos.
Unidades[170, 90, 2, 24, 45, 75, 66]Ordenação estável pelo dígito das unidades: 0, 0, 2, 4, 5, 5, 6.
Dezenas[2, 24, 45, 66, 170, 75, 90]Ordenação estável pelo dígito das dezenas: 0, 2, 4, 6, 7, 7, 9 (170 mantém a dianteira sobre 75).
Centenas[2, 24, 45, 66, 75, 90, 170]Ordenação estável pelo dígito das centenas; só 170 tem um 1, então vai para o final. Ordenado.

Quando usar o radix sort

Use quandoEvite quando
As chaves são inteiros ou strings de comprimento fixo que você pode dividir em dígitos.Você precisa ordenar objetos arbitrários com um comparador personalizado.
As chaves têm um número pequeno e limitado de dígitos d, de modo que O(d·(n + k)) supera O(n log n).As chaves são muito longas ou ilimitadas, tornando d grande e as passagens caras.
Você precisa de uma ordenação estável e pode arcar com O(n + k) de espaço extra.A memória é escassa e os buffers O(n + k) são inaceitáveis.
O intervalo de valores ou a base k é modesto em relação a n.k é enorme, então cada passagem de counting sort domina o tempo de execução.

Código de Radix Sort

Uma implementação limpa e executável de Radix Sort em Python, JavaScript, Java, C++, C. Escolha uma linguagem, copie o código ou abra-o já carregado no Playground da Coddy.

Código de Radix Sort em Python

Python
1def radix_sort(a):2    # Sort by each decimal digit, least significant first3    max_value = max(a)4    exp = 15    while max_value // exp > 0:6        a = sort_by_digit(a, exp)7        exp *= 108    return a9
10
11def sort_by_digit(a, exp):12    buckets = [[] for _ in range(10)]13    for value in a:14        digit = (value // exp) % 1015        buckets[digit].append(value)16    # Concatenating buckets 0..9 keeps the sort stable17    return [value for bucket in buckets for value in bucket]18
19
20nums = [170, 45, 75, 90, 802, 24, 2, 66]21print("Before:", nums)22print("After: ", radix_sort(nums))
Execute este código no Playground de Python

Perguntas frequentes sobre Radix Sort

Qual é a complexidade de tempo do radix sort?
Radix sort é O(d·(n + k)), onde d é o número de dígitos e k é a base. Para inteiros de largura fixa isso é praticamente O(n), o que pode ser mais rápido que as ordenações por comparação. Ele usa O(n + k) de espaço extra.
O radix sort é estável?
Sim. O radix sort LSD se baseia em um counting sort estável em cada dígito; a estabilidade é o que faz a abordagem dígito a dígito produzir um resultado corretamente ordenado.
Quando posso usar radix sort?
Radix sort funciona com dados que podem ser decompostos em dígitos ou chaves de tamanho fixo, como inteiros ou strings de comprimento fixo. Não é uma ordenação por comparação de propósito geral, então não consegue ordenar objetos arbitrários com um comparador personalizado.
Qual a diferença entre radix sort e counting sort?
Counting sort ordena por uma única chave em uma passagem e precisa de um vetor de contagem tão grande quanto o intervalo de valores, por isso se degrada quando os valores estão muito espalhados. Radix sort aplica counting sort dígito a dígito, mantendo pequeno o vetor de contagem de cada passagem (base k), o que lhe permite lidar com grandes intervalos de valores que o counting sort simples não conseguiria.
Por que o radix sort LSD começa pelo dígito menos significativo?
Começar pelo dígito menos significativo permite que cada passagem estável preserve a ordenação estabelecida por todos os dígitos menos significativos anteriores. Quando o dígito mais significativo é processado, os empates nesse dígito já estão corretamente ordenados pelos dígitos inferiores, então o vetor fica totalmente ordenado. Ordenar primeiro pelo dígito mais significativo quebraria isso e exigiria uma abordagem recursiva diferente (radix sort MSD).
O radix sort consegue lidar com números negativos?
Não diretamente - a extração básica de dígitos assume inteiros não negativos. Soluções comuns são deslocar todos os valores somando o mínimo para que tudo fique não negativo, ou ordenar separadamente os negativos e os não negativos e depois concatenar. Ignorar isso é um erro frequente ao aplicar radix sort a dados reais.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR