前提
之前在知乎上看见一个有意思的排序算法——睡排序。
睡排序最早好像是4chan上一个用户用shell脚本实现的:
算法思想简洁明了:利用进程的sleep来实现 越大的数字越迟输出。
虽然像2L说的那样,这个算法没什么利用价值。但我打算试着用Java来实现一下这个“睡排序”。
Java实现
既然选择用Java来实现,我们就没必要为数组中每一个元素启一个进程,启多线程就够了。
Java启线程的方式有很多:1.继承Thread 2.实现Runnable 3.实现Callable ...
而当前需求是要同时启固定数量的多个线程,那么通过Executor提供的线程池来启线程最合适不过了。
下面是代码:
public static List<Integer> sleepSort(int[] nums){ List<Integer> res = new Vector<>(); ExecutorService executor = Executors.newFixedThreadPool(nums.length); IntStream.of(nums).forEach(i -> executor.execute(() -> { try { Thread.sleep(i * 200); } catch (InterruptedException e) { e.printStackTrace(); } res.add(i); })); executor.shutdown(); while (true){ if (executor.isTerminated()) break; } return res; }
几个注意点:
1. 作为一个排序方法只是打印结果的话未免有些单调,所以我打算返回一个List作为排序后的结果。