Radix Sort Algoritması
Radix Sort Açıklaması
Radix Sort, sayıların basamak değerlerine göre sıralama yapan, karşılaştırma yapmayan bir sıralama algoritmasıdır. Her basamak için ayrı bir sıralama işlemi uygulayarak, en düşük anlamlı basamaktan (LSD - Least Significant Digit) başlayıp en yüksek anlamlı basamağa (MSD - Most Significant Digit) doğru ilerler. ## Çalışma Prensibi: 1. Dizideki maksimum sayıyı bularak, gerekli basamak sayısını belirle. 2. En düşük anlamlı basamaktan (birler basamağı) başlayarak, her basamak için: a. Elemanları o basamaktaki değerlerine göre grupla (genellikle Counting Sort kullanılır). b. Gruplara göre diziyi yeniden düzenle. 3. Her basamak için bu işlemi tekrarla, en yüksek anlamlı basamağa kadar. ## Önemli Özellikler: 1. **Karşılaştırma Yapmadan Sıralama**: Diğer karşılaştırma tabanlı algoritmaların aksine, elemanları birbiriyle karşılaştırmaz. 2. **Kararlı Sıralama**: Eşit değere sahip elemanların göreceli sırası korunur (Counting Sort kararlı uygulandığında). 3. **Zaman Karmaşıklığı**: O(d × (n + k)), burada d basamak sayısı, n eleman sayısı, k ise olası basamak değeri sayısı (decimal için 10). 4. **Sınırlı Uygulama Alanı**: En verimli şekilde sayılar, stringler ve sabit uzunluktaki veriler için çalışır. Radix Sort, sayılar çok büyük olmadığında ve basamak sayısı makul olduğunda oldukça verimlidir. Özellikle, tüm sayıların aynı basamak sayısına sahip olduğu durumlar için idealdir.
Kod Örnekleri
Radix Sort algoritmasının farklı programlama dillerindeki uygulamaları aşağıda verilmiştir. Her örnek, algoritmanın optimize edilmiş versiyonunu içerir ve detaylı açıklamalarla sunulmuştur.
1/**2 * Radix Sort implementation for JavaScript arrays3 * @param {Array} arr - The array of non-negative integers to sort 4 * @returns {Array} - A new sorted array 5 */6function radixSort(arr) {7 // Create a copy to avoid modifying the original array8 const result = [...arr];9 10 // Edge case: empty array11 if (result.length === 0) return result;12 13 // Find the maximum element to determine the number of digits14 const max = Math.max(...result);15 16 // Do counting sort for every digit position17 // Start from least significant digit (LSD) to most significant digit (MSD)18 for (let exp = 1; Math.floor(max / exp) > 0; exp *= 10) {19 // Call counting sort for the current digit20 countingSortByDigit(result, exp);21 }22 23 return result;24}2526/**27 * Counting sort implementation that sorts based on a specific digit position28 * @param {Array} arr - The array to sort 29 * @param {number} exp - The current digit position (1, 10, 100, ...)30 */31function countingSortByDigit(arr, exp) {32 const n = arr.length;33 const output = new Array(n).fill(0);34 const count = new Array(10).fill(0); // Digits are 0-935 36 // Count occurrences of each digit at the current position37 for (let i = 0; i < n; i++) {38 const digit = Math.floor(arr[i] / exp) % 10;39 count[digit]++;40 }41 42 // Change count[i] so that it contains the position of this digit in output[]43 for (let i = 1; i < 10; i++) {44 count[i] += count[i - 1];45 }46 47 // Build the output array in a stable way (traversing from end to start)48 for (let i = n - 1; i >= 0; i--) {49 const digit = Math.floor(arr[i] / exp) % 10;50 output[count[digit] - 1] = arr[i];51 count[digit]--;52 }53 54 // Copy the output array to arr55 for (let i = 0; i < n; i++) {56 arr[i] = output[i];57 }58}
Kendi Verilerinizle Test Edin
Aşağıya kendi verilerinizi girerek Radix Sort algoritmasını test edebilirsiniz. Virgülle ayrılmış pozitif tam sayılar girin (örn: 170,45,75,90,802,24,2,66). Not: Radix Sort sadece tam sayılarla çalışır ve negatif değerler için ek işlemler gerektirir.
Radix Sort Demo
Verdiğiniz dizi Radix Sort algoritması ile sıralanacaktır.
Not: Radix Sort, d basamaklı n sayı için O(d(n+k)) karmaşıklığa sahiptir. Burada k basamak değeri aralığıdır (decimal için 10).
Algoritma Analizi
Zaman ve Alan Karmaşıklığı
Zaman Karmaşıklığı
- En İyi Durum:
O(d(n+k))
- Burada d basamak sayısı, n eleman sayısı, k olası basamak değeri sayısı (decimal için 10). - Ortalama Durum:
O(d(n+k))
- Karmaşıklık, giriş verisinin dağılımından bağımsızdır. - En Kötü Durum:
O(d(n+k))
- Dizinin durumundan etkilenmez, sadece basamak sayısına bağlıdır.
Alan Karmaşıklığı
O(n+k)
- Her basamak sıralaması için, sayaç dizisi (k boyutunda) ve çıktı dizisi (n boyutunda) için ekstra bellek kullanır. Yerinde (in-place) bir sıralama algoritması değildir.
Kararlılık (Stability)
Radix Sort kararlı bir algoritmadır, çünkü her basamak sıralaması kararlı bir şekilde (genellikle Counting Sort ile) yapılır. Bu sayede, aynı basamak değerine sahip sayıların göreceli sırası korunur.
Avantajlar ve Dezavantajlar
Avantajlar
- Karşılaştırma yapmadığı için karşılaştırma tabanlı algoritmaların O(n log n) alt sınırını aşabilir.
- Sabit basamak sayısına sahip sayılar için, O(n) zaman karmaşıklığına yaklaşabilir.
- Kararlı bir sıralama algoritmasıdır, eşit değere sahip elemanların orijinal sırasını korur.
- Stringler ve sabit uzunluktaki veri yapıları için de kullanılabilir.
- Çok büyük dizilerde ve çok geniş değer aralıklarında bile verimli olabilir.
Dezavantajlar
- Basamak sayısı çok farklı olan sayılarda verimsiz olabilir.
- Ekstra bellek gerektirir (yerinde sıralama yapmaz).
- Negatif sayılar için doğrudan uygulanamaz, ek değişiklikler gerektirir.
- Ondalık sayılar (float, double) için özel adaptasyonlar gerektirir.
- Çok büyük basamak sayısına sahip sayılarda, çok fazla iterasyon gerekebilir.
Radix Sort ve Diğer Algoritmalar
Radix Sort ile diğer sıralama algoritmalarının karşılaştırması:
Özellik | Radix Sort | Counting Sort | Quick Sort | Merge Sort |
---|---|---|---|---|
Karşılaştırma Yapar mı? | Hayır | Hayır | Evet | Evet |
Zaman Karmaşıklığı | O(d(n+k)) | O(n+k) | O(n log n) (Ortalama) | O(n log n) |
Alan Karmaşıklığı | O(n+k) | O(n+k) | O(log n) | O(n) |
Kararlılık | Kararlı | Kararlı | Kararsız | Kararlı |
Veri Kısıtlamaları | Sabit boyutlu anahtarlar | Sınırlı aralıklı tam sayılar | Yok | Yok |
Geniş Değer Aralıklarında Verimlilik | Yüksek | Düşük | Yüksek | Yüksek |
Tercih Edilme Durumu | Geniş aralıklı sabit boyutlu anahtarlar | Küçük tam sayı aralıkları | Genel amaçlı | Kararlılık önemli olduğunda |
Radix Sort, sınırlı basamak sayısına sahip sayılar için mükemmel bir seçimdir ve geniş değer aralıklarında Counting Sort'a göre daha verimlidir. Özellikle tüm sayıların benzer basamak sayısına sahip olduğu durumlarda, karşılaştırma tabanlı algoritmalara göre daha iyi performans gösterebilir.
Radix Sort Nasıl Çalışır?
Aşağıda, Radix Sort'un [170, 45, 75, 90, 802, 24, 2, 66] dizisini sıralama adımları gösterilmiştir:
Adım Adım Radix Sort
Başlangıç Dizisi:
[170, 45, 75, 90, 802, 24, 2, 66]
1. Adım: Birler basamağına göre sıralama (exp = 1)
Birler basamağındaki değerler: [0, 5, 5, 0, 2, 4, 2, 6]
[170, 90, 802, 2, 24, 45, 75, 66]
Sıralama sonrası, birler basamağı: [0, 0, 2, 2, 4, 5, 5, 6]
2. Adım: Onlar basamağına göre sıralama (exp = 10)
Onlar basamağındaki değerler: [7, 9, 0, 0, 2, 4, 7, 6]
[802, 2, 24, 45, 66, 170, 75, 90]
Sıralama sonrası, onlar basamağı: [0, 0, 2, 4, 6, 7, 7, 9]
3. Adım: Yüzler basamağına göre sıralama (exp = 100)
Yüzler basamağındaki değerler: [1, 0, 0, 0, 0, 0, 0, 8]
[2, 24, 45, 66, 75, 90, 170, 802]
Sıralama sonrası, yüzler basamağı: [0, 0, 0, 0, 0, 0, 1, 8]
Sonuç: Tamamen Sıralanmış Dizi
[2, 24, 45, 66, 75, 90, 170, 802]
İlgili Algoritmalar
Radix Sort ile ilişkili veya benzer algoritmalar:
Counting Sort
Radix Sort'un her basamak sıralaması için kullanılan temel algoritma. Sınırlı değer aralığında lineer zaman karmaşıklığı sunar.
MSD Radix Sort
En yüksek anlamlı basamaktan (MSD) başlayarak sıralama yapar. Daha erken kesme imkanı sunabilir, ancak implementasyonu daha karmaşıktır.
Bucket Sort
Veriyi "kovalara" böler ve her kovayı ayrı ayrı sıralar. Düzgün dağılımlı verilerde Radix Sort gibi lineer karmaşıklık gösterebilir.
Radix Sort
Basamak değerlerine göre sıralama yapan, karşılaştırma yapmayan bir algoritma.
Avantajlar
- Karşılaştırma yapmadan sıralama yapabilir
- Geniş değer aralıklarında Counting Sort'tan daha verimlidir
- Kararlı bir sıralama algoritmasıdır
- Dizinin durumundan bağımsız olarak tutarlı performans gösterir
Dezavantajlar
- Ekstra bellek gerektirir (yerinde sıralama yapmaz)
- Basamak sayısı çok farklı olan sayılarda verimsiz olabilir
- Negatif sayılar için ek işlemler gerektirir
- Ondalık sayılar için özel adaptasyon gerektirir