java实现猴子排序_java实现猴子排序(BogoSort)

爱丁顿在1929年阐述过一个“无限猴子理论”,就是说“如果许多猴子任意敲打打字机键,最终可能会写出大英博物馆所有的书”。

书可以看作是字母的组合,大英博物馆所有的书作为有限集是包含在字母的组合这个无限集之中的。有限集在无限集中出现的概率不为零,这也是你说“概率肯定不为零”的原因。问题就在于“字母的组合”和“许多猴子任意敲打打字机键”两个无限集是否等价。

猴子排序引用了无限猴子定理,算法通过不停的随机排列数组,直到数组有序。

数组实现:package com.allen.testDemo;

import java.util.Arrays;

import java.util.Date;

import java.util.Random;

//猴子排序算法

public class BogoSort {

public static void main(String[] args) {

Integer[] arr = {45, 21, 67, 12, 57, 23, 68, 74, 90, 47};

Integer num = 0;

Date startDate = new Date();

System.out.println(Arrays.toString(arr));

while(!BogoSort.judgeSort(arr)){

num++;

BogoSort.upset(arr);

}

System.out.println("共执行了" + num + "次,消耗时间" + (new Date().getTime() - startDate.getTime()) + "ms");

System.out.println(Arrays.toString(arr));

}

//随机打乱数组

public static Integer[] upset(Integer[] arr){

Random rand = new Random();

Integer tmp = null;

for(int i = 0; i 

//遍历到位置右侧未排序数组随机一个下标的值与左侧交换

Integer randNum = rand.nextInt(arr.length - i) + i;

tmp = arr[randNum];

arr[randNum] = arr[i];

arr[i] = tmp;

}

System.out.println(Arrays.toString(arr));

return arr;

}

//判断数组是否正序排列

public static boolean judgeSort(Integer[] arr){

for(int i = 0; i 

if(arr[i] >= arr[i + 1]){

return false;

}

}

return true;

}

}

979adfea46abdc8d6ec0cd5fa39ac57e.png

list实现:package com.allen.testDemo;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Date;

import java.util.List;

public class MonkeySort {

public static void main(String[] args) {

List list = new ArrayList<>();

list.add(45);

list.add(21);

list.add(67);

list.add(12);

list.add(23);

list.add(68);

list.add(74);

list.add(90);

list.add(47);

System.out.println(list.toString());

Integer num = 0;

Date startDate = new Date();

while(!MonkeySort.judgeSort(list)){

num++;

Collections.shuffle(list);

System.out.println(list.toString());

}

System.out.println("共执行了" + num + "次,消耗时间" + (new Date().getTime() - startDate.getTime()) + "ms");

System.out.println(list.toString());

}

public static boolean judgeSort(List list){

for(int i = 0; i 

if(list.get(i) >= list.get(i + 1)){

return false;

}

}

return true;

}

}

f8be65187a5117f90ed162b1ad675a3b.png

这个算法大家拿来娱乐一下就好,毕竟这个效率真的是“太高了”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值