前言
首先得介绍一下无限猴子定理,这个定理是来自埃米尔·博雷尔一本1909年出版谈概率的书籍,当中介绍了“打字的猴子”的概念。
猴子定理定义如下:
一般关于此定理的叙述为:有无限只猴子用无限的时间会产生特定的文章。
其他取代的叙述,可能是用大英图书馆或美国国会图书馆取代法国国家图书馆;另一个常见的版本是英语使用者常用的,就是猴子会打出莎士比亚的著作。欧洲大陆还有一种说法版是猴子打出大英百科全书。在《从一到无穷大》中,作者则引用了哈姆雷特的例子。
详细推导过程参考百度百科
那么根据猴子定理,如果我们不断随机打乱一个可排序的数组,在无限长的时间里,这个数组肯定会变成有序数组。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| package org.example;
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner;
public class MonkeySort {
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<Integer> nums = new ArrayList<>(); for (int i = 0; i < 5; i++) { nums.add(scanner.nextInt()); } monkeySort(nums); for (Integer num : nums) { System.out.println(num); } }
private static void monkeySort(ArrayList<Integer> nums) { while (!checkSort(nums)) { upset3(nums); } }
private static void upset1(ArrayList<Integer> nums) { ArrayList<Integer> arr = (ArrayList<Integer>) nums.clone(); int length = arr.size(); nums.clear(); for (int i = 0; i < length; i++) { int j = (int) (Math.random() * arr.size()); nums.add(arr.get(j)); arr.remove(j); } }
private static void upset2(ArrayList<Integer> nums) { for (int i = nums.size() - 1; i >= 0; i--) { int j = (int) (Math.random() * (i)); nums.add(j, nums.get(i)); nums.remove(i + 1); nums.add(nums.get(j + 1)); nums.remove(j + 1); } }
private static void upset3(ArrayList<Integer> nums) { Collections.shuffle(nums); }
private static boolean checkSort(ArrayList<Integer> nums) { for (int i = 0; i < nums.size() - 1; i++) { if (nums.get(i) > nums.get(i + 1)) return false; } return true; } }
|
总结
猴子排序,看运气的算法。