睡眠排序
小故事:
在一个神奇的小村庄里,村长有一群活泼可爱的小动物们,它们分别是兔子、松鼠、乌龟和蜗牛。每天晚上,村长都会安排一场特殊的比赛,让大家各自按照自己的速度去完成一项任务。有一天,村长决定让他们按照年龄从小到大顺序排队,以便更好地照顾年幼的动物。但他又不想直接询问他们的年龄,于是他想出了一个有趣的办法。他告诉每只动物:“今晚,你们每个人都按照自己年龄对应的小时数去睡觉。比如,如果你一岁,就睡一个小时再回来找我;两岁就睡两个小时,以此类推。”夜幕降临,小动物们都纷纷回窝开始睡觉。首先,只有一岁的蜗牛很快就入睡并醒来,来到村长面前报到;接着,两岁的乌龟也按时醒来;然后是三岁的松鼠,最后是四岁的兔子。就这样,随着夜晚的推进,小动物们按照年龄从小到大的顺序陆续回到了村长身边。村长看着眼前排列整齐的小动物队伍,满意地点了点头,感叹道:“原来这就是传说中的‘睡觉排序’啊!”
排序的使用一个思路,把每一个元素都进行睡眠,先醒的就是最小的,剩下的依次苏醒,最终达到排序效果。
在不考虑效率的情况下,也是满足了排序。只是作为一个思路,实际千万别用!
代码示例
public static void main(String[] args) throws ExecutionException, InterruptedException {int[] arrToSort = {3, 2, 5, 1, 4};ExecutorService executor = Executors.newFixedThreadPool(arrToSort.length);List<Future<Void>> futures = new ArrayList<>();for (int num : arrToSort) {futures.add(executor.submit(new SleepSortTask(num)));}// 关闭线程池,等待所有任务完成executor.shutdown();while (!executor.isTerminated()) {}// 输出结果for (Future<Void> future : futures) {// Future.get() 会阻塞直到任务完成future.get();}}static class SleepSortTask implements Callable<Void> {private final int number;public SleepSortTask(int number) {this.number = number;}@Overridepublic Void call() {try {Thread.sleep(number * 1000L); // 假设睡眠时间单位为秒} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println(number);return null;}}