Menu
Coddy logo textTech

Radix Sort

Son güncelleme

Radix sort, tam sayılar için karşılaştırmasız bir sıralama yöntemidir. Değerleri karşılaştırmak yerine sayıları rakam rakam sıralar. En anlamsız rakam (LSD) sürümü önce birler basamağını, sonra onlar, sonra da yüzler basamağını işler ve her rakamda kararlı bir counting sort kullanır. Her geçiş kararlı olduğundan, en anlamlı rakam işlendiğinde tüm dizi sıralanmış olur. Her rakam geçişinin çubukları nasıl yeniden düzenlediğini görmek için yukarıdan oynat'a basın.

Radix sort O(d·(n + k)) sürede çalışır; burada d rakam sayısı, k ise tabandır (burada 10). Sabit genişlikli tam sayılar için bu pratikte doğrusaldır - O(n log n) karşılaştırmalı sıralamaları geçebilir - ancak yalnızca rakamlara veya anahtarlara ayrılabilen verilerde çalışır.

Zaman ve alan karmaşıklığı

DurumKarmaşıklıkNotlar
ZamanO(d·(n + k))d rakam, taban k (sabit d için doğrusal)
AlanO(n + k)Çıktı dizisi + rakam sayımları
KararlıEvetHer rakam geçişi kararlı bir counting sort'tur
Karşılaştırmalı mı?HayırDeğerleri karşılaştırmadan rakama göre sıralar
Şunda çalışırTam sayılar/anahtarlarGenel karşılaştırılabilir nesnelerde değil

Adım adım

AdımNe olur
1Kaç rakam işleneceğini bilmek için en büyük değeri bul.
2En anlamsız rakamla başla (birler basamağı).
3Diziyi o rakama göre counting sort ile kararlı biçimde sırala.
4Bir sonraki daha anlamlı rakama geç.
5Tüm rakam konumları işlenene kadar tekrarla.

Çözümlü örnek

[170, 45, 75, 90, 2, 24, 66] sıralanıyor:

GeçişDiziİşlem
Başlangıç[170, 45, 75, 90, 2, 24, 66]En büyük değer 170, dolayısıyla üç rakam geçişi gerekir.
Birler[170, 90, 2, 24, 45, 75, 66]Birler basamağına göre kararlı sıralama: 0, 0, 2, 4, 5, 5, 6.
Onlar[2, 24, 45, 66, 170, 75, 90]Onlar basamağına göre kararlı sıralama: 0, 2, 4, 6, 7, 7, 9 (170, 75 karşısında önceliğini korur).
Yüzler[2, 24, 45, 66, 75, 90, 170]Yüzler basamağına göre kararlı sıralama; yalnızca 170 bir 1 içerdiği için en sona geçer. Sıralandı.

Radix sort ne zaman kullanılır

Şu durumda kullanŞu durumda kaçın
Anahtarlar, rakamlara ayırabileceğin tam sayılar veya sabit uzunluklu dizeler olduğunda.Özel bir karşılaştırıcıyla rastgele nesneleri sıralaman gerektiğinde.
Anahtarların rakam sayısı d küçük ve sınırlı olduğunda, böylece O(d·(n + k)), O(n log n)'i geçer.Anahtarlar çok uzun veya sınırsız olduğunda; bu d'yi büyütür ve geçişleri pahalı yapar.
Kararlı bir sıralamaya ihtiyacın olduğunda ve O(n + k) ek alanı karşılayabildiğinde.Bellek kısıtlı olduğunda ve O(n + k) tamponlar kabul edilemez olduğunda.
Değer aralığı veya taban k, n'e göre makul olduğunda.k çok büyük olduğunda; her counting sort geçişi çalışma süresine hâkim olur.

Radix Sort kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Radix Sort uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Radix Sort kodu

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))
Bu kodu Python Playground'da çalıştır

Radix Sort SSS

Radix sort'un zaman karmaşıklığı nedir?
Radix sort O(d·(n + k))'dir; burada d rakam sayısı, k ise tabandır. Sabit genişlikli tam sayılar için bu pratikte O(n)'dir ve karşılaştırmalı sıralamalardan daha hızlı olabilir. O(n + k) ek alan kullanır.
Radix sort kararlı mıdır?
Evet. LSD radix sort her rakamda kararlı bir counting sort'a dayanır; rakam rakam yaklaşımın doğru sıralanmış bir sonuç üretmesini sağlayan şey bu kararlılıktır.
Radix sort'u ne zaman kullanabilirim?
Radix sort, tam sayılar veya sabit uzunluklu dizeler gibi rakamlara ya da sabit boyutlu anahtarlara ayrıştırılabilen verilerde çalışır. Genel amaçlı bir karşılaştırmalı sıralama değildir, bu yüzden rastgele nesneleri özel bir karşılaştırıcıyla sıralayamaz.
Radix sort ile counting sort arasındaki fark nedir?
Counting sort tek bir anahtara göre tek geçişte sıralar ve değer aralığı kadar büyük bir sayım dizisine ihtiyaç duyar, bu nedenle değerler yayıldığında verimi düşer. Radix sort, counting sort'u rakam rakam uygulayarak her geçişin sayım dizisini küçük tutar (taban k) ve böylece basit counting sort'un baş edemeyeceği büyük değer aralıklarını işleyebilir.
LSD radix sort neden en anlamsız rakamla başlar?
En anlamsız rakamla başlamak, her kararlı geçişin önceki daha az anlamlı rakamların oluşturduğu sıralamayı korumasını sağlar. En anlamlı rakam işlendiğinde, o rakamdaki eşitlikler alt rakamlara göre zaten doğru sıralanmış olur, böylece dizi tamamen sıralanır. Önce en anlamlı rakamla sıralamak bunu bozar ve farklı, özyinelemeli bir yaklaşım (MSD radix sort) gerektirir.
Radix sort negatif sayılarla başa çıkabilir mi?
Doğrudan değil - temel rakam çıkarımı negatif olmayan tam sayıları varsayar. Yaygın çözümler, tüm değerlere minimumu ekleyerek hepsini negatif olmayan hale getirmek ya da negatifleri ve negatif olmayanları ayrı ayrı sıralayıp sonra birleştirmektir. Bunu göz ardı etmek, radix sort'u gerçek verilere uygularken sık yapılan bir hatadır.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA