睡眠排序的封装

之前看到几个有意思的排序,其中一个是睡眠排序,主要思路是利用线程中的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;
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值