Pozitif tamsayı değerleri dizisi doğrusal zamanda sıralamakla ilgileniyorum (tek tip maliyet ölçülü RAM modelinde, yani tamsayılar logaritmik boyuta sahip olabilir, ancak aritmetik işlemlerin alınacağı varsayılır birim zaman). Tabii ki, bu karşılaştırma tabanlı sıralama algoritmaları ile imkansız, bu yüzden bir "yaklaşık" sıralama, yani bazı permütasyon hesaplamak ilgileniyorum bir gerçekten genel olarak sıralanmadığından hangi fakat sıralı versiyonunun "iyi yaklaşım" . Tamsayıları azalan düzende sıraladığımızı varsayacağım, çünkü neticeyi belirtmek biraz daha hoş hale getiriyor, ancak elbette biri sorunu başka bir şekilde ifade edebilir.
Yaklaşık bir sıralama için bir muhtemel kriter, aşağıdaki (*): izin olmak her için , o gerektiren (örneğin, "yarı sıralama" listesi yukarıdan ). Gerçek sıralamanın bunu karşıladığını görmek kolaydır: den daha büyük olmamalıdır , bu yüzden en fazla olan ve genel olarak , olan.
Örneğin, gereksinim (*) aşağıdaki algoritma ile elde edilebilir (@Louis tarafından önerilir). Benim sorum: Gerçek türün tatmin edeceği (*) gibi bazı şartlar getirerek, “neredeyse tamsayıları lineer zamanda sıralama” görevi üzerinde mevcut bir çalışma var mı? Aşağıdaki algoritmanın veya bunun bazı varyantlarının yerleşik bir adı var mı?
Düzenleme: algoritma düzeltildi ve daha fazla açıklama eklendi
Algoritma:
INPUT: V an array of size n containing positive integers
OUTPUT: T
N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+
For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+
Bu algoritma aşağıdaki nedenlerle amaçlandığı gibi çalışır:
- Bir eleman ise kova içinde j Daha sonra V ≤ N / j .
kovaya yerleştirilir , bu nedenle
- Bir eleman ise kova içinde daha sonra ya veya .
j = dakika ( N / hac , n ) j = ⌊ N / hac ⌋ j = n j = ⌊ N / hac ⌋ J ≤ N / hac < j + 1 N / ( j + 1 ) < v kovaya , bu nedenle veya . İlk durumda yani ve dolayısıyla .
İçin , orada, en az, kova elemanları 1 ila .
Bırakın ve , kovalardan birinde bulunan toplam eleman sayısı 1. olsun. J. Tarafından 2. her elemanı, var bir kova ile ( ) şekildedir . Bu nedenle, toplam gelen kova bütün elemanların için daha büyük olan . Ancak bu toplam da azdır, bu nedenle bize veya veren ve dolayısıyla .v i i ≤ j N / ( j + 1 ) ≤ N / ( i + 1 ) < v
tatmin (*), yani ait inci elemanı gibi olduğu
Tarafından 3. o sahip , ve inci elemanı , bir kova gelen ile Bu nedenle .
Bu algoritma doğrusal zaman alır.
hesaplanması doğrusal zaman alır. Kovalar yerleştirme ve yinelemeye sahip bağlantılı bir listeyle uygulanabilir . Yuvalanmış döngü, elemanlar olduğu kadar çok çalışır (yani kez).