Algoritma deterministik berikut (tanpa pembanding) bekerja untuk input tuple :(a1,…,an)
- Apakah yang Fisher-Yates mengocok menggunakan komparator Anda dengan beberapa pasangan statis (mengatakan ) sebagai flip koin (melakukan penerimaan-penolakan sampling). Jika komparator mengeluarkan 1 pertama kali, gunakan itu terbalik untuk menghindari loop penolakan tanpa akhir dalam kasus deterministik.Sebuah1< a21
- (speedup opsional: Coba satu pasangan kali, di mana n adalah panjang atau input Anda. Jika ada dua output yang berbeda, kembalikan permutasi yang diperoleh dalam (1))nn
- Sortir array Anda menggunakan sortir gabungan.
Diberikan relasi urutan deterministik sebagai pembanding, algoritma ini mengurutkan array dalam waktu karena shuffle Fisher-Yates berjalan dalam O ( n ) menggunakan maksimal O ( log n ) "acak bit" nonrandom (misalnya panggilan ke pembanding Anda ) pada setiap langkah dan gabungan, memiliki kompleksitas asimptotik yang sama. Hasil dari (1) sama sekali tidak berguna dalam kasus ini, tetapi karena diikuti oleh semacam nyata, ini tidak ada salahnya.O (nlogn )O (n)O (logn )
Diberikan flip koin nyata sebagai pembanding (1) memungkinkan array dengan probabilitas yang sama untuk setiap permutasi dan jika Anda benar-benar harus melakukan (3) (Anda ditinggalkan (2) atau (2) gagal menentukan keacakan), ini bukan salahnya karena distribusi hasil hanya tergantung pada urutan inputnya yang terdistribusi secara merata di antara semua permutasi karena (1), sehingga hasil dari seluruh algoritma juga terdistribusi secara seragam. Jumlah setiap pengambilan sampel penerimaan-penolakan harus diulang didistribusikan secara geometris (tolak dengan probabilitas ) dan karena itu memiliki nilai yang diharapkan<2. Setiap penggunaan pengulangan palinglognbit, sehingga analisis runtime hampir sama seperti dalam kasus deterministik, tetapi kami hanya mendapatkanruntime diharapkandariO(nlogn), dengan kemungkinan nontermination (Menghentikan hanyahampir pasti).<12<2lognO(nlogn)
Seperti Joe menunjukkan: Jika Anda tidak menyukai tes untuk bit pertama dalam (1), melakukan (3) maka (1) dan menggunakan yang selalu 0 , karena array sudah diurutkan dalam kasus deterministik. Selain itu Anda harus mengurangi angka acak Anda dari batas atas pada rentang dalam loop, karena batas atas untuk angka acak menghasilkan permutasi yang sama. Namun ketahuilah bahwa (2) itu dilarang, karena Anda selalu harus melakukan shuffle dalam kasus tebusan.an<a10
Anda bahkan dapat menggunakan panggilan yang sama ke komparator Anda untuk (1) dan (3), tetapi kemudian membuktikan bahwa hasilnya didistribusikan secara merata setidaknya jauh lebih sulit, jika mungkin sama sekali.
Algoritme berikut tidak memiliki fase berbeda untuk mengocok dan mengurutkan, tetapi secara asimptot lebih lambat. Ini pada dasarnya
semacam penyisipan dengan
pencarian biner . Saya akan menggunakan
untuk menunjukkan input dan
b k = ( b k , 1 , ... , b k , k ) untuk menunjukkan hasil setelah putaran ke-
k :
a=(a1,…,an)bk=(bk,1,…,bk,k)k
- Set b1,1=a1
- Jika maka b 2 = ( a 2 , a 1 ) dan ( c , d ) : = ( 2 , 1 ) lain b 2 = ( a 1 , a 2 ) dan ( c , d ) : = ( 1 , 2 ) . Dalam kedua kasus a d <a2<a1b2=(a2,a1)(c,d):=(2,1)b2=(a1,a2)(c,d):=(1,2) akan selalu menjadi 0 (mis. salah) untuk pembanding nonrandom.ad<ac0
- Untuk mendapatkan untuk k ≥ 3, dapatkan b k - 1 terlebih dahulu.bkk≥3bk−1
- Mari dan k ' = 2 l , yaitu k ' adalah kekuatan paling 2 tidak lebih kecil dari k .l=⌈log2k⌉k′=2lk′2k
- Biarkan . Untuk setiap j ∈ { 1 , … , l } biarkan
aku j = { i j - 1 + 2 l - j i j - 1 + 2 l - j > k - 1 ∧ a d < a c i j - 1 i j - 1 + 2 l -i0=0j∈{1,…,l}
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)
- il>kbk=(bk−1,1,…,bk−1,il−1,ak,bk−1,il,…,bk−1,k−1)
- bn
k−1k
Perhatikan bahwa algoritma ini tidak efisien dalam kedua mode dibandingkan dengan pengocokan dan gabungan jenis Fisher-Yates karena memasukkan elemen ke posisi sewenang-wenang mahal jika menggunakan array dan pencarian biner membutuhkan waktu linier jika menggunakan daftar. Tapi mungkin modifikasi heap sort atau tree sort dengan cara yang sama dapat menghasilkan algoritma yang lebih cepat.