Counting Sort Algoritması
Counting Sort Açıklaması
Counting Sort, karşılaştırma yapmadan sıralama yapan, belirli koşullar altında lineer zaman karmaşıklığı (O(n)) sunan bir sıralama algoritmasıdır. Giriş dizisindeki her elemanın kaç kez tekrarlandığını sayarak çalışır ve bu sayıları kullanarak sıralı bir dizi oluşturur. ## Çalışma Prensibi: 1. Giriş dizisindeki maksimum değeri bul (k). 2. k+1 uzunluğunda bir sayaç dizisi oluştur ve tümünü 0 ile başlat. 3. Giriş dizisinin her bir elemanı için, sayaç dizisinde ilgili indeksi 1 artır. 4. Sayaç dizisini kümülatif olarak güncelle (her eleman kendinden önceki ile toplanır). 5. Sıralı diziyi oluşturmak için giriş dizisini sondan başa doğru tara. 6. Her eleman için, sayaç dizisindeki değer, o elemanın sıralı dizideki konumunu belirtir. ## Önemli Özellikler: 1. **Karşılaştırma Yapmadan Sıralama**: Diğer 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. 3. **Sınırlı Uygulama Alanı**: Sadece sınırlı değer aralığına sahip tam sayılar için verimlidir. 4. **Zaman Karmaşıklığı**: O(n+k), burada n giriş dizisinin boyutu, k ise olası değer aralığı. Counting Sort, özellikle k değeri n ile karşılaştırılabilir olduğunda (k = O(n)) çok verimlidir, ancak değer aralığı çok büyükse verimli değildir.
Kod Örnekleri
Counting 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 * Counting 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 countingSort(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 count array size14 const max = Math.max(...result);15 16 // Create counting array (index 0 to max)17 const count = new Array(max + 1).fill(0);18 19 // Count frequency of each element20 for (let i = 0; i < result.length; i++) {21 count[result[i]]++;22 }23 24 // Update counting array with cumulative count25 for (let i = 1; i < count.length; i++) {26 count[i] += count[i - 1];27 }28 29 // Create the output array30 const output = new Array(result.length);31 32 // Build the output array in a stable way (traversing from end to start)33 for (let i = result.length - 1; i >= 0; i--) {34 output[count[result[i]] - 1] = result[i];35 count[result[i]]--;36 }37 38 // Copy the output array to result39 for (let i = 0; i < result.length; i++) {40 result[i] = output[i];41 }42 43 return result;44}
Kendi Verilerinizle Test Edin
Aşağıya kendi verilerinizi girerek Counting Sort algoritmasını test edebilirsiniz. Virgülle ayrılmış pozitif tam sayılar girin (örn: 5,3,8,4,2). Not: Counting Sort sadece tam sayılarla çalışır ve negatif değerler için ek işlemler gerektirir.
Counting Sort Demo
Verdiğiniz dizi Counting Sort algoritması ile sıralanacaktır.
Not: Counting Sort, değer aralığı sınırlı tam sayı dizileri için O(n+k) karmaşıklığa sahiptir. Burada k dizideki maksimum değerdir.
Algoritma Analizi
Zaman ve Alan Karmaşıklığı
Zaman Karmaşıklığı
- En İyi Durum:
O(n+k)
- Burada n giriş dizisinin boyutu, k ise değer aralığı. - Ortalama Durum:
O(n+k)
- Karmaşıklık, giriş verisinin dağılımından bağımsızdır. - En Kötü Durum:
O(n+k)
- Diğer algoritmalardan farklı olarak, dizinin durumundan etkilenmez.
Alan Karmaşıklığı
O(n+k)
- 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)
Counting Sort kararlı bir algoritma olarak uygulanabilir. Bu uygulama, giriş dizisini sondan başa doğru tarayarak eşit değerli elemanların göreceli sırasının korunmasını sağlar.
Avantajlar ve Dezavantajlar
Avantajlar
- Sınırlı aralıkta lineer zaman karmaşıklığı (O(n+k)) sağlar.
- 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.
- Kararlı bir sıralama algoritmadır, eşit değere sahip elemanların orijinal sırasını korur.
- Radix Sort gibi daha gelişmiş algoritmaların yapı taşı olarak kullanılır.
Dezavantajlar
- Sadece tam sayı veya sınırlı aralıktaki değerler için etkilidir.
- Değer aralığı (k) çok büyükse verimsiz olabilir.
- Veri kümesi boyutuna ek olarak, değer aralığı kadar ekstra bellek gerektirir.
- Negatif sayılar için doğrudan uygulanamaz, ek değişiklikler gerektirir.
- Anahtar-değer çiftleri veya daha karmaşık veri yapıları için özel uygulamalar gerektirir.
Counting Sort ve Karşılaştırmalı Algoritmalar
Counting Sort ile karşılaştırma tabanlı ve karşılaştırma yapmayan diğer sıralama algoritmalarının karşılaştırması:
Özellik | Counting Sort | Quick Sort | Radix Sort | Bucket Sort |
---|---|---|---|---|
Karşılaştırma Yapar mı? | Hayır | Evet | Hayır | Kısmen |
Zaman Karmaşıklığı | O(n+k) | O(n log n) (Ortalama) | O(d(n+k)) | O(n+k) |
Alan Karmaşıklığı | O(n+k) | O(log n) | O(n+k) | O(n+k) |
Kararlılık | Kararlı | Kararsız | Kararlı | Uygulamaya Bağlı |
Veri Kısıtlamaları | Sınırlı aralıklı tam sayılar | Yok | Sabit boyutlu anahtarlar | Düzgün dağılımlı veriler |
Tekrarlayan elemanlar için verimlilik | Yüksek | Orta | Yüksek | Orta-Yüksek |
Tercih Edilme Durumu | Küçük tam sayı aralığı | Genel amaçlı | Çok basamaklı sayılar | Düzgün dağılımlı veriler |
Counting Sort, sınırlı aralıktaki tam sayılar için mükemmel bir seçimdir ve lineer zaman karmaşıklığı sunar. Ancak, geniş değer aralıkları veya karmaşık veri türleri için uygun değildir. Bu durumlarda Radix Sort veya karşılaştırma tabanlı algoritmalar tercih edilmelidir.
İlgili Algoritmalar
Counting Sort ile ilişkili veya benzer algoritmalar:
Radix Sort
Sayıları basamak basamak sıralar ve her basamak için genellikle Counting Sort kullanır. Büyük sayılar için daha verimlidir.
Bucket Sort
Veriyi "kovalara" böler ve her kovayı ayrı ayrı sıralar. Veri düzgün dağılımlı olduğunda Counting Sort gibi lineer zaman karmaşıklığı sunar.
Pigeonhole Sort
Counting Sort'un bir varyasyonudur. Her değer için tam olarak bir "güvercin yuvası" oluşturur ve elemanları yerleştirir. Değer aralığı ve eleman sayısı yakın olduğunda idealdir.
Counting Sort
Karşılaştırma yapmadan sıralama yapan, sınırlı değer aralığında lineer zamanda çalışan bir algoritma.
Avantajlar
- Sınırlı aralıkta lineer zaman karmaşıklığı (O(n+k))
- Karşılaştırma yapmadığı için karşılaştırma tabanlı algoritmaların alt sınırını aşabilir
- Kararlı bir sıralama algoritmasıdır
- Tekrarlanan değerler için oldukça verimlidir
Dezavantajlar
- Sadece tam sayı veya sınırlı aralıktaki değerler için etkilidir
- Değer aralığı (k) çok büyükse verimsiz olabilir
- Ekstra bellek gerektirir (yerinde sıralama yapmaz)
- Negatif sayılar için doğrudan uygulanamaz