睡眠排序大法

这是一个思想比较简单,脑洞巨大的算法 -- 我们知道sleep方法可以让一个线程睡眠x毫秒,如果需要对一个有n个数的数列进行排序,我们何不为每个数创建一个线程,然后让每个线程都睡眠该数的时间,那么对于越小的数,其睡眠时间越短,越大的数,其睡眠时间越长,最后就使得所有元素完成“排序”了
缺点:不能为负数,相邻的数字可能会有误差

public static void main(String[] args) {
    int[] nums = new int[]{235, 233, 110, 789, 5, 0, 1};
    for (int item : nums) {
        new Thread(() -> {
            try {
                Thread.sleep(item);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(item);
        }).start();
    }
 
}

猴子排序大法

猴子排序引用了无限猴子定理:即一只猴子随机不停的敲击键盘,如果时间足够长,那么它总有可能会打出特定的文本,算法通过不停的随机排列数组,直到数组有序

public static void main(String[] args) {
        int count = 0;
        int[] arr = {7,5,3,1,9,20,8,13,-3,-20};
        while(! isOrdered(arr)){
            shuffle(arr);
            count++;
        }
        System.out.println("排序次数"+count);
        for(int i : arr){
            System.out.print(i+" ");
        }
    }
    
    //判断是否有序方法
    public static boolean isOrdered(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        if (arr[i - 1] > arr[i]) {
            return false;
        }
    }
    return true;
    }
    
    //随机排序方法
    public static void shuffle(int[] arr) {
        int temp;
        for (int i = 0; i < arr.length; i++) {
            int j = (int)(Math.random() * arr.length);
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
最后修改:2022 年 04 月 08 日
如果觉得我的文章对你有用,请随意赞赏