今天看到一个新的排序法 睡排序 真的是脑洞大开。。。

2017-03-02 15:24:21 +08:00
 a1310747

估计有大部分人不知道把,原理是构造 n 个线程,它们和这 n 个数一一对应。初始化后,线程们开始睡眠,等到对应的数那么多个时间单位后各自醒来,然后输出它对应的数。这样最小的数对应的线程最早醒来,这个数最早被输出。等所有线程都醒来,排序就结束了。 放个例子:

public class SleepSort {
    public static void main(String[] args){
        int[] nums={9,7,2,6,15,8,9,9,9,9,9};
        SleepSort.sort(nums);
        for(int n:nums)
            System.out.printf("%d    ",n);
    }

    public static void sort(int[] nums){
        Sleeper.idx=0;
        Sleeper.output=new int[nums.length];
        for(int i=0;i<nums.length;i++)        //[1]
            new Sleeper(nums[i]).start();

        try {
            Thread.sleep(100);                  //[2]
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for(int i=0;i<nums.length;i++)
            nums[i]=Sleeper.output[i];
    }
}

class Sleeper extends Thread{
    public static int[] output;
    public static int idx;

    private int sleep_time;

    public Sleeper(){
        this.sleep_time=0;
    }
    public Sleeper(int sleep_time){
        this.sleep_time=sleep_time;
    }
    @Override
    public void run(){
        try{
            Thread.sleep(this.sleep_time);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        output[idx++]=this.sleep_time;
    }
}
22397 次点击
所在节点    程序员
107 条回复
bp0
2017-03-02 15:27:02 +08:00
会不会睡一辈子,(手动斜眼
awolfer
2017-03-02 15:27:52 +08:00
线程开销很大吧, 这个太不划算了
a1310747
2017-03-02 15:28:01 +08:00
@bp0 哈哈哈哈 你这么一说还真有可能...
easyzhao
2017-03-02 15:28:34 +08:00
跟存数据库里 select order 一下有什么区别
a1310747
2017-03-02 15:28:34 +08:00
@awolfer 但是你不能否定这也是一种排序法 反正让我想我是想不出来
langmoe
2017-03-02 15:30:21 +08:00
其实还是相当于桶吧
jasonlz
2017-03-02 15:35:52 +08:00
怎么保证所有线程同时开始运行?
wmhx
2017-03-02 15:38:08 +08:00
coolshell.cn 看排序的时候就见过的, 听说这是复杂度最低的排序了, 没有之一.
xjtlujoe
2017-03-02 15:44:12 +08:00
这思路不错
a1310747
2017-03-02 15:47:48 +08:00
@wmhx O(n)的时间复杂度的确是最低的....
knightdf
2017-03-02 15:49:21 +08:00
时间复杂度在这个排序上已经毫无意义,哈哈哈
nbndco
2017-03-02 15:53:48 +08:00
这个方法显然不是 O(n)的, event loop 的调用过程显然还是要排序了,不然每次遍历变 n^2 了。
如果这个是 O(n),那么 sort(int *arr, int len)应该算是 O(1)的了。
qdwang
2017-03-02 15:54:46 +08:00
@langmoe 没错
linboki
2017-03-02 15:55:32 +08:00
大概本质就是是带阻塞的堆排序。
linboki
2017-03-02 15:56:30 +08:00
因为内核的定时器普遍用小根堆实现
dreasky
2017-03-02 15:57:47 +08:00
请比较 1 和 10000000000000000000
AsherG
2017-03-02 15:58:01 +08:00
哈哈哈,莫名感觉好萌
wellsc
2017-03-02 16:00:21 +08:00
又是一道面试题
a1310747
2017-03-02 16:01:16 +08:00
@AsherG 对啊 哈哈哈 这个排序法还被称为天才排序法
a1310747
2017-03-02 16:01:24 +08:00
@dreasky 我选择死亡

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/344353

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX