Aşağıdaki deterministik (karşılaştırıcı olmadan) algoritması bir giriş grubu için çalışır (a1,…,an):
- Do Fisher-Yates karıştırmak bazı statik çifti ile karşılaştırıcı kullanılarak (diyelima1<a2) bozuk para olarak (kabul-ret örneklemesi yapmak). Karşılaştırıcı çıktı verirse1 ilk kez, deterministik durumda sonsuz bir reddetme döngüsünü önlemek için ters çevirin.
- (isteğe bağlı hızlanma: Tek bir çifti deneyin n zamanlar, nerede nuzunluk veya girişinizdir. Çıkışlardan herhangi biri farklı ise (1))
- Birleştirme sıralaması kullanarak dizinizi sıralayın.
Karşılaştırıcı olarak deterministik bir sıralama ilişkisi verildiğinde, bu algoritma bir diziyi zaman içinde sıralar. O(nlogn) Fisher-Yates shuffle içeri girdiğinden O(n) maksimum kullanma O(logn)her adımda rastgele olmayan "rastgele bitler" (örn. karşılaştırıcınıza çağrılar) ve birleştirme sıralaması aynı asimptotik karmaşıklığa sahiptir. (1) 'in sonucu bu durumda tamamen işe yaramaz, ancak gerçek bir tür izlediğinden, bu zarar vermez.
Karşılaştırıcı (1) her permütasyon için eşit olasılıklı diziye izin verdiği ve gerçekten (3) (dışarıda bıraktığınız (2) veya (2) rasgeleliği belirleyemediğiniz) diziye izin verdiği için gerçek bir para çevirme verildiğinde, bu hayır sonucunun dağılımı sadece (1) nedeniyle tüm permütasyonlar arasında eşit olarak dağıtılan girdisinin sırasına bağlıdır, bu nedenle tüm algoritmanın sonucu da eşit olarak dağıtılır. Her bir kabul-ret örneklemesinin tekrarlanması kaç kez geometrik olarak dağıtılır (olasılıkla reddetme)<12) ve bu nedenle beklenen bir değere sahiptir <2. Her tekrar en fazlalognBöylece, çalışma zamanı analizi deterministik durumla neredeyse aynıdır, ancak yalnızca beklenen bir çalışma zamanı elde ederiz .O(nlogn), sonlandırmama olasılığı ile (sadece neredeyse kesin olarak sona erer ).
Joe'nun işaret ettiği gibi: (1) 'deki ilk bit için testi beğenmediyseniz, (3) sonra (1)' i yapın ve an<a1 hangisi her zaman 0, dizi zaten deterministik durumda sıralandığından. Ayrıca, rastgele sayının üst sınırından döngüdeki aralıktaki üst sınırdan çıkarmanız gerekir, çünkü rastgele sayının üst sınırı aynı permütasyonu verir. Ama o zaman (2) 'nin yasak olduğunu unutmayın, çünkü her zaman fidye davasında karıştırmayı yapmak zorundasınız.
(1) ve (3) için karşılaştırıcınıza aynı çağrıları bile kullanabilirsiniz, ancak daha sonra sonucun eşit olarak dağıtıldığını kanıtlamak, mümkünse en azından çok daha zordur.
Aşağıdaki algoritmanın karıştırmak ve sıralamak için belirgin bir aşaması yoktur, ancak asimptotik olarak daha yavaştır. Aslında
ikili arama ile
ekleme sıralama . kullanacağım
a=(a1,…,an) girişi göstermek ve
bk=(bk,1,…,bk,k) Sonucu
k-inci tur:
- Ayarlamak b1,1=a1
- Eğer a2<a1 sonra b2=(a2,a1) ve (c,d):=(2,1) Başka b2=(a1,a2) ve (c,d):=(1,2). Her iki durumda daad<ac hep olacak 0 rastgele olmayan bir karşılaştırıcı için (yani yanlış).
- Elde etmek üzere bk için k≥3 elde etmek bk−1 ilk.
- İzin Vermek l=⌈log2k⌉ ve k′=2l, yani k′ en az gücü 2 daha küçük değil k.
- İzin Vermek i0=0. Her biri içinj∈{1,…,l} İzin Vermek
ij=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪ij−1+2l−jij−1ij−1+2l−jij−1ij−1+2l−j>k−1∧ad<acij−1+2l−j>k−1∧¬(ad<ac)ij−1+2l−j≤k−1∧bk−1,ij−1+2l−j<akij−1+2l−j≤k−1∧¬(bk−1,ij−1+2l−j<ak)
- Eğer il>k tekrarla (5.) bk=(bk−1,1,…,bk−1,il−1,ak,bk−1,il,…,bk−1,k−1)
- Çıktı bn
Rastgele durum: 5 + 6'nın if cümlesi esasen kabul-ret örneklemesidir. Algoritmanın geri kalanı saf bir karışıklıktır: ilkini karıştırınk−1 öğeleri ve ekleyin k-her eleman eşit olasılıkla her pozisyona. Normal yerleştirme türünü kullanırsak, bunun yerine bir binom dağılımı elde ederiz.
Bu algoritmanın Fisher-Yates shuffle'a göre her iki modda da verimsiz olduğuna dikkat edin ve eğer bir dizi kullanılıyorsa bir öğeyi rastgele bir konuma eklemek pahalıysa ve bir liste kullanılıyorsa ikili arama doğrusal zaman gerektiriyorsa. Ancak belki de yığın sıralamasında veya ağaç sıralamasında benzer bir şekilde değişiklik yapılması daha hızlı bir algoritmaya yol açabilir.