在计算机科学中，**Bogo排序**（英語：）是個非常低效率的排序演算法，通常用在教學或測試。其原理等同將一堆卡片拋起，落在桌上後檢查卡片是否已整齊排列好，若非就再拋一次。其名字源自Quantum bogodynamics，又稱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");
}

```

### Python

```
from 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)

```

### Java

```
Random 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 (程式語言)

```
# 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

```

运行时间
----

这个排序算法基于可能性。平均而言，让所有元素都被排好序的期望比较次数渐近于{\displaystyle (e-1)n!}，期望的位置交换次数渐近{\displaystyle (n-1)n!}。 期望的位置交换次数增长地比期望比较次数快，是因为只需要比较几对元素就能发现元素是无序的，但是随机地打乱顺序所需要的交换次数却与数据长度成比例。在最差的情况下，交换和比较次数都是无限的，这就像随机投掷硬币可能连续任意次正面向上。

最好的情况是所给的数据是已经排好序的，这种情况下不需要任何位置交换，而比较次数等于{\displaystyle n-1}。

对任何固定长度的数据，算法的预期运行时间像无限猴子定理一样是无限的：总有一些可能性让被正确排好序的序列出现。

相关算法
----

### Bozo排序

**Bozo排序**是另一个基于随机数的算法。如果列表是无序的，就随机交换两个元素的位置再检查列表是否有序。

參見
--

* 暴力搜尋法

参考资料
----

1. 1 2  H. Gruber, M. Holzer and O. Ruepp: *Sorting the Slow Way: An Analysis of Perversely Awful Randomized Sorting Algorithms （页面存档备份，存于）*, 4th International Conference on Fun with Algorithms, Castiglioncello, Italy, 2007, Lecture Notes in Computer Science 4475, pp. 183-197.

外部連結
----

* Jargon File上的條目（页面存档备份，存于）
* Bogosort（页面存档备份，存于）: an implementation that runs on Unix-like systems, similar to the standard sort program.
* Bogosort: Simple C++ implementation of bogosort algorithm

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
排序算法 |
| --- |
|  |
| 理论 | 
* 計算複雜性理論
* 大O符号
* 全序关系
* 数据结构术语列表
* 原地算法
* 稳定性
* 比较排序
* 自适应排序（英语：）
* 排序网络（英语：）
* 整数排序（英语：）
* X+Y排序（英语：）
* 量子排序（英语：）

 |
|  |
| 交换排序 | 
* 冒泡排序
* 鸡尾酒排序
* 奇偶排序
* 梳排序
* 侏儒排序
* 快速排序
* 慢速排序
* 臭皮匠排序
* Bogo排序

 |
|  |
| 选择排序 | 
* 选择排序
* 堆排序
* 平滑排序（英语：）
* 笛卡尔树排序（英语：）
* 锦标赛排序（英语：）
* 圈排序（英语：）
* 弱堆排序（英语：）

 |
|  |
| 插入排序 | 
* 插入排序
* 希尔排序
* 伸展排序
* 二叉查找树排序
* 图书馆排序
* 耐心排序

 |
|  |
| 归并排序 | 
* 归并排序
* 梯级归并排序（英语：）
* 振荡归并排序（英语：）
* 多相归并排序（英语：）

 |
|  |
| 分布排序 | 
* 美国旗帜排序（英语：）
* 珠排序
* 桶排序
* 爆炸排序（英语：）
* 计数排序
* 比較計數排序
* 插值排序
* 鸽巢排序
* 相邻图排序（英语：）
* 基数排序
* 闪电排序（英语：）

 |
|  |
| 并发排序 | 
* 双调排序器（英语：）
* Batcher归并网络
* 两两排序网络（英语：）

 |
|  |
| 混合排序 | 
* 塊排序（英语：）
* Tim排序
* 内省排序
* Spread排序（英语：）
* 归并插入排序（英语：）

 |
|  |
| 其他 | 
* 拓撲排序
* 煎餅排序
* 意粉排序（英语：）

 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
算法 |
| --- |
|  |
| 排序 | 

|  |  |
| --- | --- |
| 比较排序 | 
* 冒泡排序
* 选择排序
* 插入排序
* 希尔排序
* 快速排序
* 归并排序
* 堆排序
* 鸡尾酒排序
* 梳排序
* 侏儒排序
* 图书馆排序
* 内省排序
* 奇偶排序

 |
|  |
| 线性时间排序 | 
* 鸽巢排序
* 基数排序
* 計數排序
* 桶排序

 |
|  |
| 并行排序 | 
* 排序网络（英语：）
* Batcher归并网络

 |
|  |
| 不实用的 | 
* Bogo排序
* 臭皮匠排序

 |
|  |
| 图 | 
* 拓撲排序

 |

 |
|  |
| 搜索 | 

|  |  |
| --- | --- |
| 列表 | 
* 线性搜索
* 二分搜索
* 插值搜尋

 |
|  |
| 树・图 | 
* 广度优先搜索
	+ 最良優先搜索（英语：）
	+ 均一开销搜索
	+ A\*
* 深度优先搜索
	+ 迭代深化深度优先搜索
	+ 深度限制搜索（日语：）
	+ 双向搜索
* 分枝限定法（英语：）

 |
|  |
| 字符串 | 
* KMP算法
* 博耶-穆尔字符串搜索算法
* AC自动机算法
* 拉宾-卡普算法
* bitap算法

 |

 |
|  |
| 最短路问题 | 
* 戴克斯特拉算法
* 贝尔曼-福特算法
* A\*搜尋演算法
* Floyd-Warshall算法

 |
|  |
| 最小生成树 | 
* 普林姆算法
* 克鲁斯克尔演算法

 |
|  |
| 最大流最小割 | 
* 福特-富尔克森算法
* 埃德蒙兹-卡普算法
* 迪尼茨算法

 |
|  |
| 线性规划 | 
* 单纯形法
* 卡马卡尔算法（英语：）

 |
|  |
| 順序統計量 | 
* 选择算法
* 中位数的中位数（英语：）

 |
|  |
| 種類 | 
* 精确算法
* 近似算法
* 随机化算法

 |
|  |
| 其他 | 
* 分治法
* 动态规划
* 贪心算法

 |
|  |
| **Category:算法** |

 |