Temel olarak, eğer benzer bir karşılaştırma işlevi verilirse, ortalama durumundan düşmeyecek herhangi bir sıralama algoritması olup olmadığını bilmek istersiniz:
int Compare(object a, object b) { return Random.Next(-1,1); }
... burada Random.Next (), belirtilen kapsayıcı alt ve üst sınır arasında rasgele oluşturulmuş bir tamsayı üreten bir yöntemdir.
Cevap, çoğu temel sıralama algoritmalarının ortalama durumlarına göre gerçekleştirileceğidir, çünkü aşağıdaki iki koşuldan en az birine uyuyorlar:
- İki benzersiz eleman arasında bir karşılaştırma asla sıralamada iki kez yapılmaz ve / veya
- Her bir yinelemede, en az bir elemanın doğru pozisyonu belirlenir ve böylece eleman bir daha asla karşılaştırılmaz.
Örneğin, SelectionSort, sıralanmamış öğelerin alt listesinde yinelenir, "en az" ve / veya "en büyük" öğeyi bulur (her birini en büyük değerle karşılaştırarak), doğru konumuna yerleştirir ve tekrarlar. Sonuç olarak, deterministik olmayan bir karşılaştırıcı ile bile, her yinelemenin sonunda, algoritma en az veya en büyük olduğunu düşündüğü, onu belirlemeye çalıştığı konumda elemanla değiştirdiği ve asla göz önünde bulundurmadığı bir değeri buldu. bu eleman tekrar, Durum 2'ye uyuyor. Ancak, A ve B, bu işlem sırasında birçok kez karşılaştırılabilir (en aşırı örnek olarak, ters sırada sıralanan bir dizide SelectionSort'un birkaç geçişini düşünün), bu nedenle Koşul 1'i ihlal eder. .
MergeSort, Koşul 1'e uyuyor ancak 2'ye uymuyor; Alt diziler birleştirildiğinde, aynı alt dizideki öğeler (sol veya sağ tarafta) birbirleriyle karşılaştırılmaz çünkü dizinin bu tarafındaki öğelerin kendi aralarında sıralandıkları belirlenmiştir; algoritma, hangisinin daha az olduğunu ve birleştirilmiş listede daha sonra gitmesi gerektiğini belirlemek için yalnızca her alt dizinin en az ayrıksız elemanını diğerine karşılaştırır. Bu, herhangi iki benzersiz A ve B nesnesinin en fazla bir defa birbirleriyle karşılaştırılacağı, ancak tam koleksiyondaki belirli bir öğenin "son" dizininin algoritma tamamlanana kadar bilinmediği anlamına gelir.
Genel stratejisi ve karmaşıklığı daha çok SelectionSort'a benzese de, InsertionSort, yalnızca Koşul 1'e uyar. Her ayrılmamış eleman, kontrol edilen elemandan daha az bulunan bulunana kadar, en büyük ilk olarak sıralanmış elemanlarla karşılaştırılır. eleman bu noktaya yerleştirilir ve bir sonraki eleman dikkate alınır. Sonuç, herhangi bir A ve B'nin göreceli sırasının bir karşılaştırma ile belirlendiği ve bu A ile B arasındaki diğer karşılaştırmaların hiçbir zaman gerçekleştirilmediği, ancak herhangi bir elemanın son pozisyonunun tüm elemanlar göz önüne alınana kadar bilinemediği sonucudur.
QuickSort her ikisine de uyarKoşullar. Her seviyede, bir "Pivot", "sol" taraf, pivottan daha az elemanlar içerecek ve "sağ" taraf, pivottan daha büyük elemanlar içerecek şekilde düzenlenir ve düzenlenir. Bu seviyenin sonucu, temel olarak pivot elemanının pozisyonunun bilindiği anlamına gelen (sol tarafın uzunluğundan bir indeks), pivotun hiçbir zaman diğer elementlerle karşılaştırılmadığı anlamına gelen QuickSort (sol) + pivot + QuickSort (sağ) şeklindedir. bir pivot olarak seçildikten sonra (önceki pivot elemanları ile karşılaştırılmış olabilir, ancak bu elemanlar da bilinir ve herhangi bir alt diziye dahil edilmezler) VE Pivotun zıt taraflarında biten A ve B'ler asla karşılaştırdık. Saf QuickSort'un uygulamalarının çoğunda, temel durum, şu andaki endeksinin son endeksi olduğu ve başka bir karşılaştırma yapılmayan bir unsurdur.
Her iki koşula da uymayacağını düşünebildiğim tek karşılaştırmalı sıralama, optimize edilmemiş bir BubbleSort. Sıralama, X geçişlerinden sonra en büyük X öğesinin uygun yerde olduğunu kabul etmiyorsa ve / veya listenin sıralandığını doğrulamak için "çift kontrol" geçişi kullanıyorsa, sıralama yalnızca "yapıldığında" kabul edilir. rastgele karşılaştırıcı bir takas gerçekleştirilebilir ve bu suretle, her iki bitişik bir geçiş sırasında listesindeki elemanları ve (gerçekten rastgele ise, olasılıkla ortaya çıkabilecek bir olay için geri-1 ya da 0 olan , nispeten için 25 elementin küçük bir listesi, bu 2000 şansta bir tane, 100 element için olasılık ise 3.7 * 10 -18(2/3)N−1). Karşılaştırıcının sonucunun maksimum mutlak değeri arttıkça, herhangi bir karşılaştırmanın negatif veya sıfırı döndürme olasılığı .5'e düşer ve algoritmayı sona erdirme şansı çok daha düşüktür (99 jeton şansı tüm iniş kafalarını çevirir) temelde bunun kaynama noktası nedir, 1.2'de 1 * 10 30 )
UZUN ZAMANLI BİR SONRA DÜZENLEME: Rastgele bir karşılaştırıcı içeren ve ne yapmamaya örnek olarak özel olarak tasarlanmış birkaç "çeşit" vardır; belki de en ünlüsü BogoSort'tur. Msgstr "Liste sırayla değilse, listeyi karıştır ve tekrar kontrol et". Teorik olarak edecektir sonunda hemen üstünde "optimize edilmemiş BubbleSort" gibi değerlerin doğru permütasyonu çarptı ama ortalama vaka yeterince rastgele permütasyon sonra (N! / 2) ve çünkü doğum günü sorununun faktöryel zamanlı (size yinelenen permütasyonlarla benzersiz olanlardan daha fazla karşılaşmak daha muhtemel hale gelir). Algoritmanın resmen tamamlamayı asla tamamlama olasılığı sıfırdır.