您现在的位置是:首页 >其他 >奇葩算法——猴子排序网站首页其他

奇葩算法——猴子排序

林在闪闪发光 2024-07-18 00:01:02
简介奇葩算法——猴子排序

?今日学习目标:

?猴子排序
创作者:林在闪闪发光
⏰预计时间: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个数⼀⼀对应。初始化

后,线程们开始睡眠,等到对应的那么多个时间单位后各⾃醒来,然后输出对应的数。这样最⼩的数对应的线程最早醒来,这个数最早被输出。等所有线程都醒来,排序就结束了。

面条排序 

 面条排序的基本思想是左手拿一组数,右手拿对应数组个数的挂面,按照数值将挂面折断,然后把这一把面条往桌子上竖直整理一下,这个时候数值大小已经显而易见了,之后从上往下用手按,最先碰到手的面就是最长的,也就是最大的数字

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。