面向失业编程——睡眠排序和猴子排序
前言:
前几天看抖音的时候看到了比较有趣的算法,睡眠排序,紧接着发现这些沙雕排序比较好玩,然后又自己写了个猴子排序,让大家再面试的时候再也不用害怕啦(狗头保命)
排序算法一:睡眠排序
- 睡眠排序是什么?
- 睡眠排序利用的就是CPU的调度,使用Thread的sleep函数,给每一个值都加上一个线程,让该线程睡这个值的时间,那不就是你越大睡的越久,值越小越早醒,所以能起到排序的作用
- 为什么有睡眠排序?
- (可能觉得线程不用完,不得劲)
- 睡眠排序的缺点
- 若睡眠时间之间相差很小时,容易出现误差,为了减小误差,一般需要放大睡眠倍数;
- 因为睡眠时间和数据大小有直接关系,因此数据不能太大 ,若数据很大时,睡眠时间要很久,程序运行时间很长;
- 睡眠时间不能为负数,如果排序数据中存在负数,需要按照一定的规律把对应的睡眠时间转换成正数,比如说在设置睡眠时间时,把每一项都加上一个正数(该正数的绝对值要比最小负数的绝对值要大)
算法代码
public class text_1 extends Thread {
public static void main(String[] args) {
ma();
}
public static void ma() {
int[] num = new int[]{1, 3, 7, 5, 2, 4};
for (int i : num) {
new Thread(() -> {
try {
Thread.sleep(i);
} catch (InterruptedException e) {
e.printStackTrace();
} //用lambda表达式提升一下B格
System.out.println(i);
}).start();
}
}
}
排序算法二:猴子排序
- 猴子排序是什么
- 让一群猴子在打印机前昼夜不停地敲打键盘,最终有可能能输入一部莎士比亚作品集——尽管概论微乎其微。同理,把一堆扑克牌扔到天上,等它们落下来的时候有概率会刚刚好从小到大排成一列。
- 简单的来说,就是把要排列的数组随机打乱,总能有一种情况是排列好的情况
- 缺点和优点
- 优点:有一定的几率可以第一次就排序好
- 缺点:随机性太大,耗时太长
算法代码
public class monkey {
public static void main(String[] args) {
int[] num=new int[]{1,3,4,2,5,1};
monkeysort(num);
System.out.println(Arrays.toString(num));
}
public static void monkeysort(int[] nums)
{
map:while (true) {
List<Integer> integers = Ints.asList(nums);//转为list集合
Collections.shuffle(integers);//打乱数组,但是需要传入list集合
int[] ints = Ints.toArray(integers);//转为数组
//判断当前数组是否有序
for (int i = 0; i < ints.length - 1; i++) {
if (ints[i] > ints[i + 1]) {
continue map;//不正确重新打乱
}
}
//如果有序了,将排序好的数组拷贝
System.arraycopy(ints,0,nums,0,ints.length);
break ;
}
}
}
其中,我们需要用到array数组转list的函数,所以我们需要在maven中引入谷歌提供的guava工具类
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
最终的输出结果为:
简直完美啊!