首先我们介绍无限猴子定理

无限猴子定理最早是由埃米尔·博雷尔在1909年出版的一本谈概率的书籍中提到的,此书中介绍了“打字的猴子”的概念。无限猴子定理是概率论中的柯尔莫哥洛夫的零一律的其中一个命题的例子。大概意思是,如果让一只猴子在打字机上随机地进行按键,如果一直不停的这样按下去,只要时间达到无穷时,这只猴子就几乎必然可以打出任何给定的文字,甚至是莎士比亚的全套著作也可以打出来。

根据猴子定理,如果我们不断用随机的数字组成一个数列,那么在无限长的时间里,这个数列在某次肯定会变成有序。

关于猴子定理的实现,网上也有很多实例,但是大部分都是和上述一样,生成随机数字的数列,然后验证是否有序,我觉得这样实际上并不一种排序,我理解的排序就是对现有的数列进行排序,因此实现时做了一定的改造

  1. 给出一个固定的乱序数列
  2. 随机从这个乱序数列中取出数字放在第一位,然后重复取数字放在第二位,第三位....
  3. 验证新的数列是否有序

这样做能更好的切合排序的概念

private static int [] array = new int[10];
private static int [] result = new int[10];

array用于存储固定的乱序数列,result用于存储每次生成的新数列

private static boolean checkOrder (int array[]){for (int i = 1; i < 10; i++){if (array[i] <= array[i-1]){return false;}}return true;}

chekorder检查数组是否有序

private static void sort(int num, Random random){Set<Integer> numberSet = new HashSet<Integer>();System.out.println("第" + num + "次");for (int i = 0; i < 10; i++){int index = random.nextInt(10);while (numberSet.contains(index)){index = random.nextInt(10);}numberSet.add(index);int number = array[index];result[i] = number;System.out.print(" " + result[i]);}System.out.println();}

sort是随机取数进行排序,这里为了能每次都取出不同数字,用Set做了已经使用过的验证,这样主要是为了能更快的得到结果

最后运行程序

可以看到猴子排序在这次排序共生成41781次数列,耗时2S就生成了一组有序的数列,这样看是不是猴子排序比睡眠排序的效率要高很多。

全部代码:

public class MonkeySort {private static int [] array = new int[10];private static int [] result = new int[10];static{generate();}/*** 检查数组是否有序* @return*/private static boolean checkOrder (int array[]){for (int i = 1; i < 10; i++){if (array[i] <= array[i-1]){return false;}}return true;}private static void sort(int num, Random random){Set<Integer> numberSet = new HashSet<Integer>();System.out.println("第" + num + "次");for (int i = 0; i < 10; i++){int index = random.nextInt(10);while (numberSet.contains(index)){index = random.nextInt(10);}numberSet.add(index);int number = array[index];result[i] = number;System.out.print(" " + result[i]);}System.out.println();}private static void generate(){array[0]=8;array[1]=5;array[2]=3;array[3]=6;array[4]=4;array[5]=9;array[6]=7;array[7]=10;array[8]=1;array[9]=2;}public static void main(String[] args){Random random = new Random();int num = 0;long startTime = System.currentTimeMillis();while(true){sort(num++,random);boolean isOrder = checkOrder(result);if (isOrder){break;}}long endTime = System.currentTimeMillis();System.out.println("排序完成,耗时:" + (endTime-startTime)/1000 + " S");}}

微信公众号:二虎程序

源码地址:https://github.com/TigerTurbo/jvm_lecture/blob/master/src/main/java/com/yshuoo/jvm/classloader/MonkeySort.java

奇葩算法系列——猴子排序相关推荐

  1. 奇葩算法系列——睡眠排序 (面条排序)

    睡眠排序源于网上流传的一个段子,版本也很多,有的是面试写的,有的是刚入职写的,总之当时在网上是火过一段时间的. 基本原理也很简单,利用CPU的调度原理,通过创建与待排数列元素个数相等的线程,在执行的时 ...

  2. 奇葩算法系列——量子猴子排序

    之前我们介绍过猴子排序 https://blog.csdn.net/yshuoo/article/details/103831424 猴子排序的思想很简单,但是算法的时间复杂度太慢了,于是有人引入了当 ...

  3. 三白话经典算法系列 Shell排序实现

    山是包插入的精髓排序排序,这种方法,也被称为窄增量排序.因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元 ...

  4. (不入流的排序算法)------猴子排序

    前言: 这个算法其实没啥使用,现在常用的排序算法(内部排序)还是那十大排序算法,什么快排,归并,堆等等,这个算法可以了解了解. 猴子排序 猴子代表乱的意思,猴子排序的意思就是随机排序,直到有序为止. ...

  5. 【经典算法】:猴子排序

    猴子排序是一种什么样子的排序呢? 猴子代表乱的意思,猴子排序的意思就是乱排序,直到有序为止. 这个真实的含义就是把一个无序的数组进行乱排序,然后看其是否会有序,这是个概率性事件,有可能一次之后就有序了 ...

  6. 看图轻松理解数据结构与算法系列(合并排序)

    前言 推出一个新系列,<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的 ...

  7. 链接分析算法系列-机器学习排序

    这个系列的文章:原文 一:链接分析算法之:HITS算法: HITS(HITS(Hyperlink - Induced Topic Search) ) 算法是由康奈尔大学( Cornell Univer ...

  8. 精通八大排序算法系列:二、堆排序算法

    精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...

  9. Java排序 - 不实用的几个排序算法 -- 睡眠排序、猴子排序、面条排序、珠排序...

    介绍几个不实用的排序算法,一来可以在学习时增加一些乐趣,放松一下自己,二来可以学习一下.思考一下这些算法失败在哪里,又是否存在一些好的地方? 睡眠排序 这是一个思想比较简单,脑洞巨大的算法 -- 我们 ...

  10. 排序算法系列:Shell 排序算法

    概述 希尔排序(Shell Sort)是 D.L.Shell 于 1959 年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是 O(n2n^{2}n2) 的,希尔排序算法是突破这个时间复杂度 ...

最新文章

  1. 微生物相关网络构建教程:MENA, LSA, SparCC和CoNet
  2. ajax 更新模型数据_PyTorch视觉工具包torchvision重大更新!支持各种检测模型、分割模型,还有许多数据集...
  3. oracle12c分页,ArcSDE10.2.1使用Oracle12c新特性分页
  4. hadoop 2.9.2 yarn配置公平调度器
  5. matlab直流电机双闭环控制系统设计,基于MATLAB的直流电机双闭环调速系统设计毕业论文.doc...
  6. [原创] 指针操作程序答案 — 谭浩强C语言习题答案
  7. 2019.01.29【NOIP普及组】模拟赛C组总结
  8. python子进程关闭fd_gpg –passphrase-fd无法使用python 3子进程
  9. linux内核设计与实现 怎么读,《Linux内核设计与实现》CHAPTER1,2阅读梳理
  10. javascript 进度条的几种方法
  11. 【获奖公布】元老选手心得分享:请把自己看成一位出色的工程师
  12. 渗透测试实践(工具使用总结)
  13. 让ubuntu使用root帐号并让winscp以root身份登录
  14. U-Net及使用keras搭建U-Net分割网络以及改进和问题纪实
  15. UltraEdit 26 总是偶尔提示运行的是试用模式
  16. 小球放入盒中的方法总结(排列组合)
  17. html创建站点文件夹,构建及访问Web站点
  18. STM32 HAL库函数学习 UART篇
  19. 红米note7找android,红米 NOTE7 PRO简易测评与去广告
  20. UNIX的spctl命令

热门文章

  1. 一个过不了情关的男人!!
  2. 《动手学深度学习》(PyTorch版)代码注释 - 32 【RNN_with_zero】
  3. 沿海当地平均海面与85面高程关系
  4. fault、error、failure辨析
  5. 如何看台式机计算机编号,如何查看台式电脑的主机编号和型号
  6. 使用分治法解最大连续子序列和问题
  7. Pegasus Serial Port Tool @ Simplicity Version 串口测试工具简化版发布
  8. Java学习笔记——十大经典排序算法总结
  9. 2 创造你的物理世界(1)
  10. CuraEngine三维切片源码编译与解读