Apakah ada algoritma penyortiran yang lebih buruk daripada Bogosort (alias Monkey Sort)? [Tutup]

178

Rekan kerja saya membawa saya kembali ke masa-masa Universitas saya dengan diskusi tentang penyortiran algoritma pagi ini. Kami mengenang tentang favorit kami seperti StupidSort , dan salah satu dari kami yakin kami telah melihat semacam algoritma itu O(n!). Itu membuat saya mulai mencari-cari algoritma penyortiran "terburuk" yang bisa saya temukan.

Kami mendalilkan bahwa jenis acak sepenuhnya akan sangat buruk (yaitu mengacak elemen - apakah itu dalam urutan? Tidak? Mengacak lagi), dan saya melihat sekeliling dan menemukan bahwa itu tampaknya disebut BogoSort, atau Macam Monyet, atau kadang-kadang hanya Urutan Acak .

Sortir Monyet tampaknya memiliki kinerja kasus terburuk O(∞), kinerja kasus terbaik O(n), dan kinerja rata-rata O(n·n!).

Apa algoritma pengurutan yang diterima saat ini dengan kinerja pengurutan rata-rata terburuk (dan karena itu menjadi lebih buruk daripada O(n·n!))?

Womp
sumber
10
Berapa banyak bogomips per bogosort? Pikiran yang ingin tahu ingin tahu.
zombat
13
Untuk memperjelas, apakah Anda mengecualikan kasus sepele di mana kinerja kasus terbaik adalah O (∞)?
tloflin
6
Saya mendengar bahwa jenis monyet juga dikenal sebagai "jenis pria mabuk", sebuah nama yang saya temukan jauh lebih menggugah.
Matteo Italia
6
@Matteo Italia - atau bisa disebut "Jenis Balita" karena siapa saja yang berusia 2 tahun dapat membuktikannya.
Martin Capodici

Jawaban:

442

Dari halaman Algoritma Esoterik David Morgan-Mar : Urutan Desain Cerdas

pengantar

Sorting desain cerdas adalah algoritma pemilahan berdasarkan teori desain cerdas.

Deskripsi Algoritma

Kemungkinan daftar input asli berada dalam urutan persisnya adalah 1 / (n!). Ada kemungkinan kecil hal ini sehingga jelas tidak masuk akal untuk mengatakan bahwa ini terjadi secara kebetulan, jadi pasti secara sadar dimasukkan ke dalam urutan itu oleh Penyortir yang cerdas. Karena itu aman untuk berasumsi bahwa itu sudah diurutkan secara optimal dalam beberapa cara yang melampaui pemahaman fana kita yang naif tentang "tatanan naik". Setiap upaya untuk mengubah urutan agar sesuai dengan prasangka kita sendiri sebenarnya akan membuatnya kurang diurutkan.

Analisis

Algoritma ini konstan dalam waktu, dan mengurutkan daftar di tempat, tidak memerlukan memori tambahan sama sekali. Bahkan, itu bahkan tidak memerlukan semua hal yang mencurigakan dari teknologi komputer. Puji Penyortir!

Umpan balik

Gary Rogers menulis:

Menjadikan penyortiran konstan dalam waktu menyangkal kekuatan Penyortir. Penyortir ada di luar waktu, sehingga penyortir tidak akan lekang oleh waktu. Membutuhkan waktu untuk memvalidasi jenis ini akan mengurangi peran Penyortir. Jadi ... jenis khusus ini cacat, dan tidak dapat dikaitkan dengan 'Penyortir'.

Bidaah!

BioGeek
sumber
94
Juga dikenal sebagai "Urutan Asumsi": Asumsikan daftar diurutkan, kembali!
BioGeek
42
+100 - jawaban ini terbuat dari 100% kemenangan murni.
Menginjak
11
Hei! Jangan lupa "Sortasi Tidak Jelas" (Juga dikenal sebagai "Sortasi Schrodinger" atau "Sortasi Kuantum"), di mana daftar tersebut dapat atau tidak dapat disortir, namun memeriksa apakah itu benar atau tidak. Berikut ini adalah contoh implementasi saya: void quantum_sort (void *b, size_t n, size_t s, int (*c)(const void *, const void*)) { if (rand () % 2) qsort (b, n, s, c); }.
Joe D
6
Kita harus menjuluki Urutan Candide ini :"This is the best of all posibble worlds because it is the world that is, and so in the best possible world the array would already be sorted!"
echochamber
2
Saya, untuk satu, menyambut tuan penyortiran baru kami. Semua memuji tukang sortir!
Bryson
299

Bertahun-tahun yang lalu, saya menemukan MiracleSort (tetapi tidak pernah benar-benar diterapkan).

Start with an array in memory.
loop:
    Check to see whether it's sorted.
    Yes? We're done.
    No? Wait a while and check again.
end loop

Akhirnya, partikel alfa yang membalik bit dalam chip memori akan menghasilkan jenis yang sukses.

Untuk keandalan yang lebih besar, salin array ke lokasi terlindung, dan periksa array berpotensi diurutkan terhadap yang asli.

Jadi, bagaimana Anda memeriksa array yang berpotensi diurutkan terhadap yang asli? Anda cukup mengurutkan setiap array dan memeriksa apakah cocok. MiracleSort adalah algoritma yang jelas digunakan untuk langkah ini.

EDIT: Sebenarnya, ini bukan algoritma, karena tidak dijamin akan berakhir. Apakah "bukan suatu algoritma" memenuhi syarat sebagai "algoritma yang lebih buruk"?

Keith Thompson
sumber
39
Saya berasumsi orang dapat menggunakan sinar kosmik untuk membuktikan kebenaran dari algoritma ini.
ghord
1
Apa O besar ini? O(2^N)?
Mooing Duck
12
@ MoingDuck: Saya tidak berpikir itu benar-benar memiliki O besar.
Keith Thompson
5
@ MoingDuck: Sebenarnya, jika tidak berakhir itu bukan algoritma, sesuai dengan apa yang mereka ajarkan kepada saya di perguruan tinggi dan artikel Wikipedia .
Keith Thompson
7
@Olathe: The Halting Problem mengatakan kita tidak bisa menentukan untuk semua program apakah mereka berhenti, tetapi ada banyak program yang bisa kita buat tekadnya. Kami tahu Quicksort dan Bubblesoft berhenti, dan kami tahu itu adalah algoritme.
Keith Thompson
133

Bogumort Kuantum

Algoritma pengurutan yang mengasumsikan bahwa interpretasi mekanika kuantum banyak dunia adalah benar:

  1. Pastikan daftar diurutkan. Jika tidak, hancurkan jagat raya.

Pada akhir algoritme, daftar akan diurutkan dalam satu-satunya alam semesta yang tersisa. Algoritma ini membutuhkan waktu kasus terburuk O (N) dan kasus rata-rata O (1). Faktanya, jumlah rata-rata perbandingan yang dilakukan adalah 2: ada kemungkinan 50% bahwa alam semesta akan dihancurkan pada elemen kedua, peluang 25% bahwa itu akan dihancurkan pada elemen ketiga, dan seterusnya.

BiGeek
sumber
42
Tetapi waktu tidak lagi ada di alam semesta yang baru saja Anda hancurkan. Jadi pengamat di alam semesta yang belum Anda periksa tidak akan dapat mengetahui berapa banyak algoritme yang telah dieksekusi. Dengan demikian, algoritma ini selalu membutuhkan waktu O (1), karena penghancuran alam semesta sebelumnya tidak ada lagi.
Barry Brown
12
Ya, di satu-satunya alam semesta yang mengamati daftar yang disortir, butuh O (n) waktu untuk mengeksekusi - berapa lama waktu yang diperlukan di alam semesta lain tidak relevan.
Nick Johnson
19
Algoritma ini memiliki masalah yang jauh lebih besar. Asumsikan bahwa satu dari 10 miliar kali Anda akan keliru menyimpulkan daftar diurutkan ketika tidak. Ada 20! cara mengurutkan daftar elemen 20. Setelah pengurutan, alam semesta yang tersisa akan menjadi satu di mana daftar itu diurutkan dengan benar, dan 2,4 juta alam semesta di mana algoritma secara keliru menyimpulkan daftar itu diurutkan dengan benar. Jadi apa yang Anda miliki di sini adalah sebuah algoritma untuk memperbesar secara besar-besaran tingkat kesalahan sebuah mesin.
Nick Johnson
10
Ini jelas merupakan algoritma penyortiran terbaik, bukan yang terburuk.
Boann
11
Kegagalan untuk memimpin saran Beetle dapat mengakibatkan semua alam semesta dihancurkan.
CrashCodes
60

Saya terkejut belum ada yang menyebutkan sleepsort ... Atau belumkah saya menyadarinya? Bagaimanapun:

#!/bin/bash
function f() {
    sleep "$1"
    echo "$1"
}
while [ -n "$1" ]
do
    f "$1" &
    shift
done
wait

contoh penggunaan:

./sleepsort.sh 5 3 6 3 6 3 1 4 7
./sleepsort.sh 8864569 7

Dalam hal kinerja itu mengerikan (terutama contoh kedua). Menunggu hampir 3,5 bulan untuk mengurutkan 2 angka agak buruk.

Kw4s
sumber
3
Ini tampaknya menjadi O(N)semacam, tetapi sebenarnya dibatasi oleh namun timer OS alat.
Mooing Duck
7
Apa pun cara Anda memotongnya, ini mungkin menunjukkan pertumbuhan yang lebih baik daripada bogosort.
Mooing Duck
8
Saya melihat kondisi balapan di sana.
5
Anda dapat mengubah sleep "$1"ke sleep "0.$(printf "%010d" $1)"untuk meningkatkan kinerja secara nyata. time ./sleepsort.sh 8864569 7kemudian berjalan di 0,009 di laptop saya.
Sam Kellett
1
Ini berjalan dalam kompleksitas O (N) (tentu saja tergantung pada implementasi timer), ini adalah semacam bucket sederhana dalam bentuk yang berbeda.
Qwerty01
60

Sortasi Jingle, seperti dijelaskan di sini .

Anda memberikan setiap nilai dalam daftar Anda kepada anak yang berbeda pada hari Natal. Anak-anak, sebagai manusia yang mengerikan, akan membandingkan nilai hadiah mereka dan menyortir diri mereka sendiri.

Curtis Lassam
sumber
50

Saya punya dosen yang pernah menyarankan membuat array acak, memeriksa apakah itu diurutkan dan kemudian memeriksa apakah datanya sama dengan array yang akan diurutkan.

Kasus terbaik O (N) (bayi pertama kali!) Kasus terburuk O (Tidak pernah)

Daniel
sumber
4
Lebih menarik untuk dianalisis adalah kasus rata - rata , yaitu ...?
Mooing Duck
4
Seperti semua buku teks terbaik katakan, ini dibiarkan sebagai latihan untuk pembaca!
Daniel
40
Mooing Duck: O (kadang-kadang)
Ilya O.
1
@ MoooDuck maka kita perlu mengetahui kardinalitas jenis elemen dan distribusi yang digunakan untuk menghasilkan elemen acak dalam array acak.
Nama Tampilan
5
Kompleksitasnya adalah O (N! * Z ^ N) di mana Z adalah ukuran himpunan nilai yang mungkin dan N adalah panjang array.
jakubiszon
30

Jika Anda mempertahankan algoritme dengan cara apa pun, O(n!)adalah batas atas terburuk yang dapat Anda capai.

Karena memeriksa setiap kemungkinan permutasi dari satu set yang akan diurutkan akan mengambil n!langkah - langkah, Anda tidak bisa mendapatkan yang lebih buruk dari itu.

Jika Anda melakukan langkah-langkah lebih dari itu maka algoritma tidak memiliki tujuan yang sangat berguna. Belum lagi algoritma penyortiran sederhana berikut dengan O(infinity):

list = someList
while (list not sorted):
    doNothing
Yuval Adam
sumber
14
Tetapi perlu O (n) untuk memeriksa apakah sudah diurutkan, sehingga Anda bisa mendapatkan O (n * n!)
erikkallen
3
@ erikkallen: Tentu saja kita dapat membuat algoritma untuk memverifikasi penyortiran yang lebih buruk daripada O (n). Misalnya, untuk setiap elemen dalam array, verifikasi bahwa itu lebih besar dari semua elemen sebelumnya, seperti karya penyisipan. Itu adalah algoritma O (n ^ 2), dan saya yakin saya bisa membuat yang lebih buruk mengingat sedikit pemikiran.
David Thornley
7
@ David Thornley: algoritma pemeriksaan berikut ini mungkin akan menunjukkan semangat yang sama dengan bogosort: pilih dua elemen acak, periksa bahwa yang memiliki indeks lebih kecil lebih kecil atau sama dengan yang dengan indeks lebih besar, kemudian ulangi. Simpan matriks bit persegi untuk melihat kombinasi mana yang sudah diperiksa. Tentu saja, memeriksa matriks ini juga dapat dilakukan secara acak ...
Svante
19

Bogobogosort. Ya, itu hal. ke Bogobogosort, Anda Bogosort elemen pertama. Periksa untuk melihat apakah satu elemen diurutkan. Menjadi satu elemen, itu akan menjadi. Kemudian Anda menambahkan elemen kedua, dan Bogosort keduanya sampai diurutkan. Kemudian Anda menambahkan satu elemen lagi, lalu Bogosort. Lanjutkan menambahkan elemen dan Melakukan Bogosorting sampai Anda selesai melakukan semua elemen. Ini dirancang untuk tidak pernah berhasil dengan daftar besar sebelum kematian panas alam semesta.

Playnwinplayer
sumber
5
Ibu kode yang suci. Saya pikir kita bahkan dapat melakukan Bogolplex pendek.
MrKekson
19

Anda harus melakukan penelitian di bidang Algoritma Pessimal dan Analisis Simpleksitas yang menarik . Para penulis ini bekerja pada masalah mengembangkan semacam dengan kasus terbaik pessimal (kasus terbaik bogosort Anda adalah Omega (n), sementara slowsort (lihat kertas) memiliki kompleksitas waktu kasus terbaik non-polinomial).

Derrick Turk
sumber
19

Ada semacam yang disebut bogobogosort. Pertama, ia memeriksa 2 elemen pertama, dan bogosort mereka. Selanjutnya periksa 3 pertama, bogosort mereka, dan sebagainya.

Jika daftar ini rusak, kapan saja, akan dimulai lagi dengan melakukan bogosort pada 2 yang pertama lagi. Bogosort biasa memiliki kompleksitas rata-rata O(N!), algoritma ini memiliki kompleksitas rata-rataO(N!1!2!3!...N!)

Sunting : Untuk memberi Anda gambaran tentang seberapa besar angka ini, untuk 20elemen, algoritma ini membutuhkan rata-rata 3.930093*10^158 tahun , jauh di atas panas yang diusulkan kematian alam semesta (jika terjadi) 10^100 tahun ,

sedangkan pengurutan penggabungan membutuhkan waktu sekitar .0000004 detik , pengurutan gelembung .0000016 detik , dan bogosort membutuhkan waktu 308 bertahun - tahun , 139 berhari-hari , 19 berjam-jam , 35 menit , 22.306 detik , dengan asumsi satu tahun adalah 365,222 hari dan komputer melakukan 250.000.000 32 bit operasi integer per detik.

Sunting2 : Algoritma ini tidak selambat jenis keajaiban "algoritma", yang mungkin, seperti jenis ini, akan membuat komputer tersedot ke dalam lubang hitam sebelum berhasil mengurutkan 20 elemtnts, tetapi jika ya, saya akan memperkirakan kompleksitas rata-rata 2^(32(the number of bits in a 32 bit integer)*N)(the number of elements)*(a number <=10^40) bertahun - tahun ,

karena gravitasi mempercepat chip alpha yang bergerak, dan ada 2 ^ N status, yaitu 2^640*10^40, atau sekitar 5.783*10^216.762162762 bertahun - tahun , meskipun jika daftar mulai diurutkan, kompleksitasnya hanya akan O(N), lebih cepat daripada menggabungkan jenis, yang hanya N log N bahkan pada kasus terburuk.

Sunting3 : Algoritme ini sebenarnya lebih lambat daripada jenis keajaiban karena ukurannya menjadi sangat besar, katakan 1000, karena algoritma saya akan memiliki jangka waktu 2.83*10^1175546 bertahun - tahun , sedangkan algoritma jenis keajaiban akan memiliki jangka waktu 1.156*10^9657 bertahun - tahun .

Humming bird
sumber
1
jawaban yang bagus sedih itu tidak memiliki visibilitas
swyx
16

Inilah 2 macam saya datang dengan teman sekamar saya di perguruan tinggi

1) Periksa pesanan 2) Mungkin keajaiban terjadi, buka 1

dan

1) periksa apakah sudah beres, jika tidak 2) masukkan setiap elemen ke dalam sebuah paket dan bangkit kembali dari server yang jauh ke diri Anda sendiri. Beberapa paket tersebut akan kembali dalam urutan yang berbeda, jadi buka 1

Seth
sumber
Yang kedua hampir setara dengan jenis bozo. Tapi yang pertama adalah pintar.
Mooing Duck
1
Yang pertama adalah Miracle Sort.
Charles
14

Selalu ada Bogobogosort (Bogoception!). Ia melakukan Bogosort pada himpunan bagian yang semakin besar dari daftar, dan kemudian mulai dari awal lagi jika daftar tersebut tidak pernah diurutkan.

for (int n=1; n<sizeof(list); ++n) {
  while (!isInOrder(list, 0, n)) {
    shuffle(list, 0, n);
  }
  if (!isInOrder(list, 0, n+1)) { n=0; }
}
IceMetalPunk
sumber
5
Saya suka gagasan bahwa algoritma ini dirancang untuk tidak pernah menyelesaikan "sebelum kematian panas alam semesta untuk daftar yang cukup besar"
A.Grandt
10

1 Masukkan barang-barang Anda untuk diurutkan pada kartu indeks
2 Lemparkan ke udara pada hari yang berangin, satu mil dari rumah Anda.
2 Lemparkan mereka ke api unggun dan pastikan mereka benar-benar hancur.
3 Periksa lantai dapur Anda untuk pemesanan yang benar.
4 Ulangi jika ini bukan urutan yang benar.

Scenerio kasus terbaik adalah O (∞)

Sunting di atas berdasarkan pengamatan cerdik oleh KennyTM.

Patrick Karcher
sumber
9
Tidak, ini lebih buruk karena tidak ada peluang untuk berhasil. Bagaimana kartu indeks masuk ke dapur Anda? Mereka berkeliaran di luar. Ini disebut, eh, tapi kepala sekolah.
Patrick Karcher
Saya pikir dia bermaksud melemparkan kartu ke udara di luar , dan kemudian memeriksa lantai Anda di dalam , di mana ada jaminan tidak ada kartu. Meskipun bukan algoritma "bernama" ... tentu saja lebih buruk!
Menginjak
10
@Patrick Quantum tunneling.
kennytm
8
@ KennyTM. Itu benar-benar terpikir oleh saya. Ada peluang yang sangat kecil tetapi tidak nol bahwa benda apa pun dapat menghilang dan muncul kembali pada titik lain di alam semesta. Saya kira itu bisa terjadi pada seribu kartu indeks. . . Oi. Dangit, algoritme saya cacat . Saya akan memperbaikinya. . .
Patrick Karcher
3
Rasanya seperti minum teh dan tidak minum teh secara bersamaan. Atau perjalanan ruang angkasa menggunakan drive ketidakmungkinan yang tak terbatas.
Barry Brown
9

"Kamu ingin jadi apa?" menyortir

  1. Catat waktu sistem.
  2. Sortir menggunakan Quicksort (atau apa pun yang masuk akal), menghilangkan swap terakhir.
  3. Catat waktu sistem.
  4. Hitung waktu yang dibutuhkan. Diperpanjang aritmatika presisi adalah persyaratan.
  5. Tunggu waktu yang dibutuhkan.
  6. Lakukan swap terakhir.

Tidak hanya dapat mengimplementasikan nilai O (x) yang mungkin pendek dari tak terbatas, waktu yang diperlukan terbukti benar (jika Anda bisa menunggu selama itu).

david.pfx
sumber
8

Tidak ada yang lebih buruk daripada tak terbatas.

Joseph Salisbury
sumber
38
Infinity + 1. Jinx, tidak ada pengembalian.
zombat
24
Bukan untuk nilai yang sangat besar dari 1;)
zombat
8
Apa yang benar-benar mengejutkan pikiran saya tentang konsep infinity, adalah Anda dapat memiliki "ukuran" infinity yang berbeda. Sebagai contoh, pertimbangkan himpunan semua bilangan bulat - ukurannya tidak terbatas. Sekarang pertimbangkan himpunan semua bilangan bulat genap - ukurannya juga tak terbatas, tetapi juga jelas setengah dari ukuran himpunan pertama. Keduanya tak terbatas, tetapi ukurannya berbeda. Sangat mengagumkan. Konsep "ukuran" gagal untuk bekerja dalam konteks ketidakterbatasan.
zombat
4
@ Zombat: Anda berbicara tentang kardinalitas, bukan infinity sebagai simbol yang menunjukkan tren pada garis nyata / bidang kompleks.
kennytm
18
@ zombat. Ukuran himpunan bilangan bulat sama dengan ukuran himpunan bilangan bulat, seperti yang ditunjukkan oleh fakta bahwa Anda dapat menempatkannya dalam korespondensi satu-ke-satu. Sekarang, ada lebih banyak bilangan real daripada bilangan bulat, seperti yang pertama kali ditunjukkan oleh Cantor.
David Thornley
5

Bozo sort adalah algoritma terkait yang memeriksa apakah daftar diurutkan dan, jika tidak, menukar dua item secara acak. Ini memiliki penampilan kasus terbaik dan terburuk yang sama, tetapi saya secara intuitif berharap kasus rata-rata lebih lama dari Bogosort. Sulit untuk menemukan (atau menghasilkan) data apa pun tentang kinerja algoritma ini.

tloflin
sumber
5

Segmen π

Asumsikan π berisi semua kemungkinan kombinasi angka hingga. Lihat pertanyaan math.stackexchange

  1. Tentukan jumlah digit yang dibutuhkan dari ukuran array.
  2. Gunakan segmen π tempat sebagai indeks untuk menentukan cara memesan ulang array. Jika segmen melebihi batas ukuran untuk array ini, sesuaikan offset imal desimal dan mulai lagi dari awal.
  3. Periksa apakah array yang dipesan ulang sudah diurutkan. Jika woot, sesuaikan offset dan mulai lagi dari awal.
CrashCodes
sumber
4

Kinerja kasus terburuk O (∞) bahkan mungkin tidak menjadikannya suatu algoritma menurut beberapa orang .

Algoritma hanyalah serangkaian langkah dan Anda selalu dapat melakukan yang lebih buruk dengan mengubah sedikit untuk mendapatkan hasil yang diinginkan dalam lebih banyak langkah daripada sebelumnya. Seseorang dapat dengan sengaja menaruh pengetahuan tentang jumlah langkah yang diambil ke dalam algoritma dan membuatnya berhenti dan menghasilkan output yang benar hanya setelah Xsejumlah langkah telah dilakukan. Itu Xbisa sangat urutan O (n 2 ) atau O (n n! ) Atau apa pun algoritma yang ingin dilakukan. Itu akan secara efektif meningkatkan batas kasus terbaik dan rata-rata.

Tetapi skenario terburuk Anda tidak dapat diatapi :)

Anurag
sumber
3

Algoritma pengurutan lambat favorit saya adalah jenis antek:

void stooges(long *begin, long *end) {
   if( (end-begin) <= 1 ) return;
   if( begin[0] < end[-1] ) swap(begin, end-1);
   if( (end-begin) > 1 ) {
      int one_third = (end-begin)/3;
      stooges(begin, end-one_third);
      stooges(begin+one_third, end);
      stooges(begin, end-one_third);
   }
}

Kompleksitas kasus terburuk adalah O(n^(log(3) / log(1.5))) = O(n^2.7095...).

Algoritma pengurutan lambat lainnya sebenarnya bernama slowsort!

void slow(long *start, long *end) {
   if( (end-start) <= 1 ) return;
   long *middle = start + (end-start)/2;
   slow(start, middle);
   slow(middle, end);
   if( middle[-1] > end[-1] ) swap(middle-1, end-1);
   slow(start, end-1);
}

Yang ini mengambil O(n ^ (log n))kasus terbaik ... bahkan lebih lambat dari antek.

Ben Goldberg
sumber
3
Recursive Bogosort (probably still O(n!){
if (list not sorted)
list1 = first half of list.
list 2 = second half of list.
Recursive bogosort (list1);
Recursive bogosort (list2);
list = list1 + list2
while(list not sorted)
    shuffle(list);
}
pengguna3667082
sumber
2

Halaman ini adalah bacaan menarik tentang topik ini: http://home.tiac.net/~cri_d/cri/2001/badsort.html

Favorit pribadi saya adalah Tom Duff's sillysort:

/*
 * The time complexity of this thing is O(n^(a log n))
 * for some constant a. This is a multiply and surrender
 * algorithm: one that continues multiplying subproblems
 * as long as possible until their solution can no longer
 * be postponed.
 */
void sillysort(int a[], int i, int j){
        int t, m;
        for(;i!=j;--j){
                m=(i+j)/2;
                sillysort(a, i, m);
                sillysort(a, m+1, j);
                if(a[m]>a[j]){ t=a[m]; a[m]=a[j]; a[j]=t; }
        }
}
fsanches
sumber
2

Bogosort ganda

Bogosort dua kali dan bandingkan hasilnya (hanya untuk memastikan itu diurutkan) jika tidak melakukannya lagi

Viktor Mellgren
sumber
1

Anda dapat membuat algoritma pengurutan apa pun lebih lambat dengan menjalankan langkah "apakah diurutkan" secara acak. Sesuatu seperti:

  1. Buat array booleans dengan ukuran yang sama dengan array yang Anda sortir. Jadikan semuanya salah.
  2. Jalankan iterasi bogosort
  3. Pilih dua elemen acak.
  4. Jika dua elemen diurutkan dalam kaitannya dengan satu sama lain (i <j && array [i] <array [j]), tandai indeks keduanya pada array boolean menjadi true. Secara berlebihan, mulailah dari awal.
  5. Periksa apakah semua boolean dalam array benar. Jika tidak, kembali ke 3.
  6. Selesai
Brendan Long
sumber
1

Ya, SimpleSort, secara teori ini berjalan di O(-1)bagaimanapun ini setara denganO(...9999) yang pada gilirannya setara dengan O (∞ - 1), yang seperti itu juga setara dengan O (∞). Berikut ini contoh implementasi saya:

/* element sizes are uneeded, they are assumed */
void
simplesort (const void* begin, const void* end)
{
  for (;;);
}
Joe D
sumber
1

Satu yang baru saja saya kerjakan melibatkan memilih dua poin acak, dan jika mereka berada di urutan yang salah, membalikkan seluruh subrange di antara mereka. Saya menemukan algoritma di http://richardhartersworld.com/cri_d/cri/2001/badsort.html , yang mengatakan bahwa case rata-rata mungkin ada di sekitar O (n ^ 3) atau O (n ^ 2 log n) ( dia tidak begitu yakin).

Saya pikir mungkin untuk melakukannya lebih efisien, karena saya pikir mungkin untuk melakukan operasi pembalikan dalam O (1) waktu.

Sebenarnya, saya baru sadar bahwa melakukan itu akan membuat semua yang saya katakan mungkin karena saya baru menyadari bahwa struktur data yang ada dalam pikiran saya akan menempatkan mengakses elemen acak di O (log n) dan menentukan apakah perlu membalikkan pada O (n ).

AJMansfield
sumber
1

Randomsubsetsort.

Diberikan array elemen n, pilih setiap elemen dengan probabilitas 1 / n, acak elemen-elemen ini, dan periksa apakah array diurutkan. Ulangi sampai diurutkan.

Waktu yang diharapkan dibiarkan sebagai latihan untuk pembaca.

Steven Armstrong
sumber