🏆今日学习目标:
🍀猴子排序
✅创作者:林在闪闪发光
⏰预计时间:30分钟
🎉个人主页:林在闪闪发光的个人主页🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光的社区
目录
故事的开始
猴子排序
睡眠排序
面条排序
故事的开始
无聊的一个下午 和朋友说有点无聊 他和我说
确实之前好像没有接触过 挺感兴趣 就去研究了一下
猴子排序
引用一下百度百科——无限猴子理论
爱丁顿在1929年阐述过一个“无限猴子理论”,就是说“如果许多猴子任意敲打打字机键,最终可能会写出大英博物馆所有的书”。
简单地说就是随便乱排 展示一下代码(这里我是用java代码实现的)
public static void bogoSort(int[] iArray){
Random r = new Random();
int num = 0;
while(true) {
System.out.println("正在执行第"+(++num)+"次排序");
System.out.println("排序之前:"+ Arrays.toString(iArray));
for (int i = 0; i < iArray.length; i++) {
swap(iArray, i, r.nextInt(iArray.length));
}
if(isSorted(iArray)){
System.out.println("排序成功");
System.out.println("排序之后:"+ Arrays.toString(iArray));
return;
}
}
}
判断是否成功的代码:
public static boolean isSorted(int[] iArrays) {
for (int i = 0; i < iArrays.length - 1; i++) {
if(iArrays[i]>iArrays[i+1]){
return false;
}
}
return true;
}
交换和随机生成逻辑代码:
//初始换一个长度为参数的随机数组,数组元素为0(含)到50(不含)的随机数
public static int[] initArray(int length){
Random r = new Random();//申明并实例化一个Random对象
int[] iArray = new int[length];//申明并实例化一个int数组用于测试排序
for (int i = 0; i < iArray.length; i++) {
//通过Random随机生成一个0(含)到50(不含)的数并插入对应位置
iArray[i] = r.nextInt(50);
}
return iArray;
}
//交换
public static void swap(int[] iArray,int i,int j){
int tmp = iArray[i];
iArray[i] = iArray[j];
iArray[j] = tmp;
}
最后主方法入口:
public static void main(String[] args) {
int[] iArrays = initArray(10);
long start = System.currentTimeMillis(); //获取开始时间
bogoSort(iArrays);
long end = System.currentTimeMillis();
//获取结束时间
System.out.println("运行时间:" + (end - start) / 1000 + "s");
}
效果
还有睡眠排序 面条排序 感兴趣的大家可以研究一下
睡眠排序
睡眠排序也称为硬件排序 充分利⽤硬件计时器的资源实现拟态算法
这个事件起源于⼀个屌丝发表了⼀个时间复杂度为
O(n)的排序算法,睡眠排序的主要逻辑是构造n个线程,它们和这n个数⼀⼀对应。初始化
后,线程们开始睡眠,等到对应的那么多个时间单位后各⾃醒来,然后输出对应的数。这样最⼩的数对应的线程最早醒来,这个数最早被输出。等所有线程都醒来,排序就结束了。
面条排序
面条排序的基本思想是左手拿一组数,右手拿对应数组个数的挂面,按照数值将挂面折断,然后把这一把面条往桌子上竖直整理一下,这个时候数值大小已经显而易见了,之后从上往下用手按,最先碰到手的面就是最长的,也就是最大的数字