Menu
CoddyTech

Radix Sort

Terakhir diperbarui

Radix sort adalah algoritma pengurutan tanpa perbandingan untuk integer. Alih-alih membandingkan nilai, algoritma ini mengurutkan bilangan digit demi digit. Versi least-significant-digit (LSD) memproses digit satuan lebih dulu, lalu puluhan, lalu ratusan, dengan counting sort yang stabil pada setiap digit. Karena setiap putaran stabil, begitu digit paling signifikan selesai diproses, seluruh array sudah terurut. Tekan Putar di atas untuk melihat setiap putaran digit menyusun ulang batang-batangnya.

Radix sort berjalan dalam waktu O(d·(n + k)), dengan d adalah jumlah digit dan k adalah basisnya (di sini 10). Untuk integer dengan lebar tetap, ini pada dasarnya linear dan bisa mengalahkan pengurutan berbasis perbandingan O(n log n), tetapi hanya bekerja pada data yang bisa dipecah menjadi digit atau key.

Kompleksitas waktu dan ruang

KasusKompleksitasCatatan
WaktuO(d·(n + k))d digit, basis k (linear untuk d yang tetap)
RuangO(n + k)Array output + hitungan digit
StabilYaSetiap putaran digit adalah counting sort yang stabil
Perbandingan?TidakMengurutkan berdasarkan digit, bukan dengan membandingkan nilai
Bekerja padaInteger/keyBukan objek umum yang bisa dibandingkan

Langkah demi langkah

LangkahApa yang terjadi
1Cari nilai maksimum untuk mengetahui berapa digit yang perlu diproses.
2Mulai dari digit paling tidak signifikan (posisi satuan).
3Urutkan array secara stabil berdasarkan digit itu dengan counting sort.
4Pindah ke digit berikutnya yang lebih signifikan.
5Ulangi sampai semua posisi digit sudah diproses.

Contoh penerapan

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

PutaranArrayAksi
Mulai[170, 45, 75, 90, 2, 24, 66]Nilai maksimumnya 170, jadi dibutuhkan tiga putaran digit.
Satuan[170, 90, 2, 24, 45, 75, 66]Urutkan secara stabil berdasarkan digit satuan: 0, 0, 2, 4, 5, 5, 6.
Puluhan[2, 24, 45, 66, 170, 75, 90]Urutkan secara stabil berdasarkan digit puluhan: 0, 2, 4, 6, 7, 7, 9 (170 tetap mendahului 75).
Ratusan[2, 24, 45, 66, 75, 90, 170]Urutkan secara stabil berdasarkan digit ratusan; hanya 170 yang punya 1, jadi bilangan itu pindah ke akhir. Terurut.

Kapan memakai radix sort

Pakai saatHindari saat
Key-nya berupa integer atau string dengan panjang tetap yang bisa dipecah menjadi digit.Kamu harus mengurutkan objek sembarang dengan comparator khusus.
Key-nya punya jumlah digit d yang kecil dan terbatas, sehingga O(d·(n + k)) mengalahkan O(n log n).Key-nya sangat panjang atau tidak terbatas, sehingga d besar dan setiap putaran mahal.
Kamu butuh pengurutan stabil dan sanggup memakai ruang tambahan O(n + k).Memori terbatas dan buffer O(n + k) tidak bisa diterima.
Rentang nilai atau basis k cukup kecil dibandingkan n.k sangat besar, sehingga setiap putaran counting sort mendominasi waktu berjalannya.

Kode Radix Sort

Implementasi Radix Sort yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Radix Sort dalam 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))
Jalankan kode ini di Playground Python

FAQ Radix Sort

Berapa kompleksitas waktu radix sort?
Radix sort bernilai O(d·(n + k)), dengan d adalah jumlah digit dan k adalah basisnya. Untuk integer dengan lebar tetap, ini pada dasarnya O(n), yang bisa lebih cepat daripada pengurutan berbasis perbandingan. Ruang tambahan yang dipakai O(n + k).
Apakah radix sort stabil?

Ya. LSD radix sort mengandalkan counting sort yang stabil pada setiap digit; stabilitas inilah yang membuat pendekatan digit demi digit menghasilkan urutan yang benar.

Kapan radix sort bisa dipakai?

Radix sort bekerja pada data yang bisa diuraikan menjadi digit atau key berukuran tetap, seperti integer atau string dengan panjang tetap. Radix sort bukan pengurutan umum berbasis perbandingan, jadi tidak bisa mengurutkan objek sembarang dengan comparator khusus.

Apa bedanya radix sort dengan counting sort?
Counting sort mengurutkan berdasarkan satu key dalam satu putaran dan butuh array hitungan sebesar rentang nilainya, jadi performanya turun saat nilainya tersebar luas. Radix sort menerapkan counting sort digit demi digit, menjaga array hitungan setiap putaran tetap kecil (basis k), sehingga bisa menangani rentang nilai besar yang tidak sanggup ditangani counting sort biasa.
Mengapa LSD radix sort dimulai dari digit paling tidak signifikan?

Memulai dari digit paling tidak signifikan membuat setiap putaran yang stabil mempertahankan urutan yang sudah dibentuk oleh semua digit sebelumnya yang kurang signifikan. Saat digit paling signifikan diproses, nilai yang sama pada digit itu sudah terurut dengan benar oleh digit-digit yang lebih rendah, jadi array akhirnya terurut sepenuhnya. Mengurutkan mulai dari digit paling signifikan akan merusak hal ini dan butuh pendekatan rekursif yang berbeda (MSD radix sort).

Bisakah radix sort menangani bilangan negatif?

Tidak secara langsung, karena ekstraksi digit dasar mengasumsikan integer yang tidak negatif. Solusi yang umum adalah menggeser semua nilai dengan offset sebesar nilai minimum agar semuanya tidak negatif, atau mengurutkan bilangan negatif dan tidak negatif secara terpisah lalu menggabungkannya. Mengabaikan hal ini adalah bug yang sering terjadi saat memakai radix sort pada data nyata.

Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai