之前看到几个有意思的排序,其中一个是睡眠排序,主要思路是利用线程中的sleep()方法,将要排序的数组中的数值大小作为睡眠的时长,先醒者为数值小者。
网上看到的好几种写法都是直接输出到控制台,我在这里做了一些改进,将结果放到list集合中实现真正的排序。
有意思的排序嘛,注重的并不是效率,睡眠排序的效率并不高。但是这个用线程睡眠的方式排序的思路太过清奇。
要注意的是数值之间的差距过小时,可能产生后醒来的线程先一步进入到“运行状态”,此时排序结果错误。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class M1 extends Thread{
int time;
List<Integer> list;
@Override
public void run() {
try {
//进来之后,该线程会睡眠time,醒来后往集合内添加,先醒的为数值较小的,
sleep(time);
list.add(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/*
parameter1 time: 睡眠时间,也即数字的大小
parameter2 list: 排序后存放的集合
*/
public M1(int time, List<Integer> list){
this.time = time;
this.list = list;
}
}
public class SleepSort {
//测试
public static void main(String[] args) throws Exception{
List<Integer> arrayList = new ArrayList<>();
Random random = new Random();
for(int i = 0; i<10; i++){
arrayList.add(random.nextInt(100));
}
long start = System.nanoTime();
arrayList = sleepSort(arrayList);
for(Integer i : arrayList)
System.out.println(i);
System.out.println("SleepSort is completed! Take time: "+ (System.nanoTime() - start) + "ns" );
}
public static List<Integer> sleepSort(List<Integer> arrayList) throws Exception{
List<Integer> res = new ArrayList<>();
List<Thread> threads = new ArrayList<>();
for (Integer i: arrayList
) {
M1 m = new M1(i,res);
m.start();
threads.add(m);
}
for (Thread t: threads
) {
t.join();
}
return res;
}
}