Bogo排序
在计算机科学中,Bogo排序(英語:Bogosort)是個非常低效率的排序演算法,通常用在教學或測試。其原理等同將一堆卡片拋起,落在桌上後檢查卡片是否已整齊排列好,若非就再拋一次。其名字源自"bogus",又稱bozo sort、blort sort或猴子排序(參見無限猴子定理)。 实现以下是偽代碼: function bogosort(arr)
while arr is not ordered
arr := 隨機排列(arr) 其平均時間複雜度是 O(n × n!),在最壞情況所需時間是無限。它並非一個穩定的算法。 C#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void swap(void *a,void *b){
unsigned char *p=a;
unsigned char *q=b;
unsigned char tmp;
tmp=*p;
*p=*q;
*q=tmp;
}
/* 洗牌函數 */
void shuffle(void *x,int size_elem,int total_elem){
int i;
for(i=total_elem-1;i>=0;--i){
int r=rand()%(i+1);
swap(x+r*size_elem,x+i*size_elem);
}
}
int main(int argc,char *argv[]){
/* 為了洗牌而需要隨機化函數,此處的函數具有偽隨機性 */
srand((unsigned)time(NULL));
int l[]={5,2,1,3,4};
int n;
n=sizeof(l)/sizeof(l[0]);
/* 先設陣列未排序=0,已排序=1 */
int isSort=0;
int i;
while(!isSort){
/* 進行洗牌動作 */
/* 等同於從搖獎機或籤筒裡依序抽出n個數 */
/* 也等同於從搖獎機或籤筒裡抽出2個數x跟y並交換l[x]與l[y](Bozo排序) */
shuffle(l,sizeof(l[0]),n);
isSort=1;
/* 檢查從搖獎機或籤筒裡所抽出來的數是否比前一個數還大 */
for(i=0;i<n-1;i++){
if(l[i]>l[i+1]){ /* 若較大的陣列編號的值比較小時則重新洗牌 */
isSort=0;
break;
}
}
}
for(i=0;i<n;i++){
printf("%d ",l[i]);
}
printf("\n");
}
Pythonfrom random import shuffle
from itertools import izip, tee
def in_order(my_list):
"""Check if my_list is ordered"""
it1, it2 = tee(my_list)
it2.next()
return all(a<=b for a,b in izip(it1, it2))
def bogo_sort(my_list):
"""Bogo-sorts my_list in place."""
while not in_order(my_list):
shuffle(my_list)
JavaRandom random = new Random();
public void bogoSort(int[] n) {
while(!inOrder(n)){
shuffle(n);
}
}
public void shuffle(int[] n) {
for (int i = 0; i < n.length; i++) {
int swapPosition = random.nextInt(i + 1);
int temp = n[i];
n[i] = n[swapPosition];
n[swapPosition] = temp;
}
}
public boolean inOrder(int[] n) {
for (int i = 0; i < n.length-1; i++) {
if (n[i] > n[i+1]) {
return false;
}
}
return true;
}
# Julia Sample : BogoSort
function inOrder(A)
for i=1:length(A)-1
if A[i]>A[i+1]
return false
end
end
return true
end
function BogoSort(A)
while (!inOrder(A))
# Shuffle
for i=1:length(A)
r = rand(1:length(A))
A[i],A[r]=A[r],A[i]
end
end
return A
end
# Main Code
A = [16,586,1,31,354,43,3]
println(A) # Original Array
println(BogoSort2(A)) # Bogo Sort Array
运行时间这个排序算法基于可能性。平均而言,让所有元素都被排好序的期望比较次数渐近于,期望的位置交换次数渐近。[1] 期望的位置交换次数增长地比期望比较次数快,是因为只需要比较几对元素就能发现元素是无序的,但是随机地打乱顺序所需要的交换次数却与数据长度成比例。在最差的情况下,交换和比较次数都是无限的,这就像随机投掷硬币可能连续任意次正面向上。 最好的情况是所给的数据是已经排好序的,这种情况下不需要任何位置交换,而比较次数等于。 对任何固定长度的数据,算法的预期运行时间像无限猴子定理一样是无限的:总有一些可能性让被正确排好序的序列出现。 相关算法Bozo排序Bozo排序是另一个基于随机数的算法。如果列表是无序的,就随机交换两个元素的位置再检查列表是否有序。 參見参考资料
外部連結 |
Index:
pl ar de en es fr it arz nl ja pt ceb sv uk vi war zh ru af ast az bg zh-min-nan bn be ca cs cy da et el eo eu fa gl ko hi hr id he ka la lv lt hu mk ms min no nn ce uz kk ro simple sk sl sr sh fi ta tt th tg azb tr ur zh-yue hy my ace als am an hyw ban bjn map-bms ba be-tarask bcl bpy bar bs br cv nv eml hif fo fy ga gd gu hak ha hsb io ig ilo ia ie os is jv kn ht ku ckb ky mrj lb lij li lmo mai mg ml zh-classical mr xmf mzn cdo mn nap new ne frr oc mhr or as pa pnb ps pms nds crh qu sa sah sco sq scn si sd szl su sw tl shn te bug vec vo wa wuu yi yo diq bat-smg zu lad kbd ang smn ab roa-rup frp arc gn av ay bh bi bo bxr cbk-zam co za dag ary se pdc dv dsb myv ext fur gv gag inh ki glk gan guw xal haw rw kbp pam csb kw km kv koi kg gom ks gcr lo lbe ltg lez nia ln jbo lg mt mi tw mwl mdf mnw nqo fj nah na nds-nl nrm nov om pi pag pap pfl pcd krc kaa ksh rm rue sm sat sc trv stq nso sn cu so srn kab roa-tara tet tpi to chr tum tk tyv udm ug vep fiu-vro vls wo xh zea ty ak bm ch ny ee ff got iu ik kl mad cr pih ami pwn pnt dz rmy rn sg st tn ss ti din chy ts kcg ve