Türleme göreviniz küçük tamsayılar için büyük diziler içeriyorsa - notlar, yaşlar veya kategorik kodlar - QuickSort veya MergeSort gibi klasik karşılaştırma tabanlı algoritmaların aşırılık gibi hissedebilir.Bu algoritmalar O (n log n) zamanında çalışır, ancak mümkün değerlerin aralığı sınırlıysa, hem de doğrusal O(n + k) zaman verirsiniz.

Nasıl Konting Sort Works

Konting Sort, giriş değerlerinin küçük bir aralığından çekildiği bilgisi kullanır:0) Çifte kıyasla karşılaştırmalar yerine, değerlerin frekans histogramı oluşturur ve sonra doğru sıralamasında her elementi yerine getirmesini kullanır.

Temel Yaklaşım: Doğrudan Yeniden Yeniden İnşa

Konting Sort'in en basit versiyonu iki geçişte çalışır:

  1. [FONT:0)Kırsal frekanslar[Dönetici:0)[[Döneticiler)[[Döneticiler) – Gördüğünüz her değer için bir karşıtlık.
  2. [FONT:0)Girişi yazmak [DÜDÜDÜDÜDÜDÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜye:0)DÜye Tarihi[DÜye Olmayanlar İçindekiler Arasıye Girin (DÜye)

Bu bir tür çıkış sağlar ancak İLFLT:0)[Döneticileri değiştir], geri dönüşlerin göreceli siparişini korur (te stabil değildir). Stability issues when you sort on a key while keeping the original order of records with equality. the sta, next, is one most common used in practice.

Stable Variant: Cumulative Counts

Konting Sort stabil yapmak için, üçüncü bir geçiş ekleriz:

  1. Daha önce olduğu gibi frekansları sayın.
  2. Frekans serisini bir miktar genel not serisine dönüştürür.Bu adımdan sonra, ESFLT:1), elementlerin sayısını ≤ENFLT:0)i).
  3. Geri dönüşteki girdi serisini (en son elementten ilk önce) her bir element için, çıktı serisinde konumunu bulmak için genel notunu kullanın, yerini tutar ve sayıyı da çürüt.

Çünkü tersine doğru hareket ediyoruz, eşit elementlerin göreceli sırası korunmuştur. Çıktı serisi girdiden ayrıdır, bu yüzden bu sürüm çıktı için O(n) ek alanı kullanır, ancak temel sürüm giriş yaparak yerleştirilebilir.

C#'de Konting Sorti Uygulamayı Uygulamayın

Aşağıda iki C# uygulama vardır: temel yer değiştirme versiyonu (tehlikeliliğin gereksiz olduğu senaryolar için) ve yardımcı dizi kullanan istikrarlı sürüm. Her ikisi de önceden en yüksek değeri bilmek gerektirir.

Temel (Non-Stable) Counting Sort

Bu değişken, doğrudan ekstra bir çıkış tampon olmadan giriş serisini çeşitlendirir. hafızaya verimlidir, ancak istikrarlı değildir.

public static void CountingSortBasic(int[] array, int maxValue)
{
 int[] counts = new int[maxValue + 1];

 // Count each element's frequency
 for (int i = 0; i < array.Length; i++)
 {
 counts[array[i]]++;
 }

 // Overwrite the original array in sorted order
 int index = 0;
 for (int value = 0; value <= maxValue; value++)
 {
 while (counts[value]-- > 0)
 {
 array[index++] = value;
 }
 }
}

Stable Counting Sorting Sorting

stabil sürüm aynı büyüklükte bir çıkış serisini girdi. Aynı zamanda, pozisyon elementlerine doğru da kullanır.

public static int[] CountingSortStable(int[] array, int maxValue)
{
 int[] counts = new int[maxValue + 1];
 int[] output = new int[array.Length];

 // Step 1: Count occurrences
 foreach (int num in array)
 {
 counts[num]++;
 }

 // Step 2: Transform counts to cumulative counts
 for (int i = 1; i <= maxValue; i++)
 {
 counts[i] += counts[i - 1];
 }

 // Step 3: Build the output array (iterate input in reverse for stability)
 for (int i = array.Length - 1; i >= 0; i--)
 {
 int value = array[i];
 output[counts[value] - 1] = value;
 counts[value]--;
 }

 return output;
}

Her iki uygulamada, [[Üyetim: 4)) Dizide görünen en büyük tam tam tam tam tam tam tam tam tam tamsa, bunu bir hazırlık tarama ile (O(n) hesaplayabilirsiniz. stabil sürüm yeni bir sıralama döndürür, orijinal değişmeden bırakır.

Kompleksi Analiz Analizi

LetFLT:0)n elementlerin ve [[Dönetici:2|[Dönetici:0) sayısı = max – min + 1 (belirli değer aralığı).

  • [FONT:0)Time:[[Dönetici:0) Konting Sort inÜŞÜNCÜT:2)O(n + k)) Zaman. Konting aşaması O(n), ve rekontrüksiyon O(n) olduğunda, o (n) O (n) o (n) o lineerdir.
  • [FONT=0}Uygun: [Dönetici: 0,3|0] Temel versiyon, sayı sayısı ile büyük ölçüde uyumlu olduğunda, O(n + k) kullanır.
  • [FONT:0]Comparison diğer türlerle karşılaştırır: HızlıSort ve MergeSort gibi karşılaştırmalı tür en az O (n log n) karşılaştırmalar gerektirir.Küçük k (e.g., k < 10.000 ve n > 100.000) Konting Sorti en hızlı şekilde sipariş verebilir.

Variations ve Extensions

Olumsuz Integers

Konting Sort yerel olarak, negatif değerleri ele almak için, tüm aralığı değiştirmek için, örneğin, sayıların -1000 ila 1000 arasında, +1000 ile her elementi dengelemek. sayı daha sonra büyüklüğü = 5).

public static int[] CountingSortWithNegative(int[] array)
{
 if (array.Length == 0) return array;

 int min = array.Min();
 int max = array.Max();
 int range = max - min + 1;

 int[] counts = new int[range];
 int[] output = new int[array.Length];

 foreach (int num in array)
 counts[num - min]++;

 for (int i = 1; i < range; i++)
 counts[i] += counts[i - 1];

 for (int i = array.Length - 1; i >= 0; i--)
 {
 int value = array[i];
 output[counts[value - min] - 1] = value;
 counts[value - min]--;
 }

 return output;
}

Mapping Non-Integer Keys

Konting Sort tamsa anahtarlar gerektirir.Eğer verileriniz karakterlerden oluşursa (baytlar), veya tamsayılara atılabilecek enumerasyonlar, bunu hala uygulayabilirsiniz.Daha büyük nesneler için, tam bir anahtar ve sıralamayı elde edebilirsiniz - Radix Sort genellikle içsel altöroutine olarak nasıl kullanır.

Radix Sort Combo

Radix Sort süreçleri basamakları (veya biraz) bireysel olarak ve Konting Sort her geçiş için doğal seçimdir (örneğin, 10 veya 256) küçükdür. Bu, lineer zaman zaman türbünleri sağlar, sadece küçük olanlar değil.

C#de Pratik Değerlendirmeler

Memory Footprint ve Large k

En büyük pitfall mevcut bellekten daha büyük bir sayı ayırt etmektir. Örneğin, 1.000.000 atık alanı olan 1.000 elementi sıralayın.Her zaman bunu doğrulayın:0)k) büyüklüğün siparişi değildir.[Dönetici[Döneticisi:2n).

Paralellik ve Span <T>

Son derece büyük diziler için, sayıdaki girdileri bölmek için sayma aşamasına paralel olarak paralelleştirebilirsiniz.Her bir konu segmentini özel bir diziye sayır ve sonra kısmi sonuçlar toplanır.ZFLT:7). ve [[DD|D|D|D|D|D|D|D|Dışmanlık aralığı küçük olduğunda ücret azaltılabilir.

Edge Cases

  • [FONT:0]Empty serisi[[[Dönetici: 1 ) – hemen geri dön.
  • [FONT:0) Tek element[[Dönetici:0)
  • [0]Tüm aynı değerler[[Dönem: 1)[Dönetici:0)[[[Dönetici:0)
  • [[DÜDÜ:0)Large aralığı ama sparse verileri) – Konting Sorti en az sıfır puandır. Bir hash bazlı say yaklaşımı veya Shell Sort Sort Sort Sort Sort Sort Sort Sort Sort Sort.

Performans Önerileri

Giriş tamsayılarının küçük bir aralığına düştüğünü bildiğiniz zaman Konting Sorti kullanın (örneğin, 0-100, yaş 0-120, veya hata kodları 0-255). Daha büyük aralıklar için Radix Sort veya üst düzey bölümler için geri dönen bir karma.

Konting Sorti Kullandığınızda (ve Ne Zaman Yapmamak)

SituationRecommendation
Small integer range (k ~ n)Excellent choice – linear time, simple code.
Large integer range (k >> n)Avoid – memory waste and O(k) overhead.
Need stabilityUse the stable variant (cumulative counts).
Strings or objectsConsider Radix Sort or a comparison sort.
Extremely large datasetsCounting Sort can be parallelized; but watch memory.

Benchmarking ve Performans

n = 1.000.000 ve k = 1000 ile tipik bir kriterde, Konting Sort, .NET ile alınan zamanın yaklaşık% 20-30'unda tamamlandı. (ki bu introsort). boşluklar k azalır. Aşağıda, yaklaşık bir karşılaştırma (execution times on a modern CPU with .NET):

n = 1,000,000 | k = 1,000
Array.Sort (QuickSort variant) : 68 ms
CountingSortBasic : 12 ms
CountingSortStable : 18 ms

Dizi 10.000'e büyüdükçe, Konting Sort hala kazanır, ancak marj dar. K = 100.000 için bellek yükü ( ⁇ 400 KB for the count array) CPU önbelleğine zarar vermeye başlar ve performans da bozulabilir.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Konting Sort, verinizin aralıklarında lineer bir performans sağlayan bir deceptly basit bir algoritmadır.C# geliştiricileri için büyük dizilerle uğraşıyor, inşa edilmiş tam zamanlı olarak zamanınızı azaltabilecek değerli bir araçtır. Verilerinizin aralıklarında bir göz tutun: eğer küçük ve bilinen, Konting daha genel bir şekilde, inşa edilmiş bir alternatif olacaktır.For C# developersinurative-up, use the built-inuratively.

Daha fazla okuma için, [[Dönderlik|[Dönderlik Hakkında pdf) makaleye danışın.[B][/FONT=3][/FONT=FONT=3}|Sort[FLT3][/FONT=FONT=FONT=3}|DeksforGeeks[FLT: 5)