之前我们介绍过猴子排序
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");
}
}
微信公众号:二虎程序