奇葩算法系列——量子猴子排序

之前我们介绍过猴子排序

https://blog.csdn.net/yshuoo/article/details/103831424

猴子排序的思想很简单,但是算法的时间复杂度太慢了,于是有人引入了当下最玄学的量子理论和当下很火的平行宇宙理论,我觉得其实就是空间换时间的思想。

对猴子排序做了升级,即量子猴排序。

如果猴子排序随机数列时,使用量子化随机排列,那么在我们观测这组数字前,他的状态是叠加的,通过这种排列我们就能划分出全排列数量的平行宇宙,下面要做的就是去观测这个宇宙,找到一个有序的平行宇宙即可。时间复杂度只有是不是快很多。

 

全部代码:

public class QuantumBogoSort {


    /**
     * 检查数组是否有序
     * @return
     */
    private static boolean checkOrder (List<Integer> list){
        for (int i = 1; i < list.size(); i++){
            if (list.get(i) <= list.get(i - 1)){
                return false;
            }
        }
        return true;
    }


    /**
     * 全排列
     */
    private static void permutationSequence(int[] array, int start, int end, List<List<Integer>> arrayList){
        if (start == end){
            List<Integer> list = new ArrayList<>();
            for (int i : array){
                list.add(i);
            }
            arrayList.add(list);
            return;
        }
        for (int i = start; i < end; i++){
            swap(array,i,start);
            permutationSequence(array,start + 1, end, arrayList);
            swap(array,i,start);
        }
    }

    private static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }


    public static void main(String[] args){

        int[] array = {9,10,8,3,7};
        List<List<Integer>> arrayList = new ArrayList<>();
        permutationSequence(array,0,array.length,arrayList);
        long startTime = System.currentTimeMillis();
        for (List<Integer> list : arrayList){
            boolean isOrder = checkOrder(list);
            if (isOrder){
                for (Integer num : list){
                    System.out.printf(num + " ");
                }
                break;
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("排序完成,耗时:" + (endTime-startTime) + " ms");

    }

}

微信公众号:二虎程序

源码地址:https://github.com/TigerTurbo/InterestingAlgorithm

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值