zoukankan      html  css  js  c++  java
  • 算法---天才排序算法---睡眠排序

    这个事件起源于一个屌丝发表了一个时间复杂度为O(n)的排序算法,这个网址如下:http://dis.4chan.org/read/prog/1295544154大家有兴趣的可以看看。

    虽然使用价值不是很高,但是能找到这么一个方法,成为天才也不为过。

    它的基本思想是,主要是根据CPU的调度算法实现的,对一组数据进行排序,不能存在负数值,这个数是多大,那么就在线程里睡眠它的10倍再加10,不是睡眠和它的数值一样大的原因是,当数值太小时,误差太大,睡眠的时间不比输出的时间少,那么就会存在不正确的输出结果。

    下面写几个此排序算法的版本

    #!/bin/bash
    function f() {
        sleep 
    "$1"
        echo 
    "$1"
    }
    while [ -"$1" ]
    do
        f 
    "$1" &
        shift
    done
    wait


    example usage:
    ./sleepsort.bash 5 3 6 3 6 3 1 4 7

    public class SleepSort {
        public static void main(String[] args) {
            int[] ints = {1,4,7,3,8,9,2,6,5};
            SortThread[] sortThreads = new SortThread[ints.length];
            for (int i = 0; i < sortThreads.length; i++) {
                sortThreads[i] = new SortThread(ints[i]);
            }
            for (int i = 0; i < sortThreads.length; i++) {
                sortThreads[i].start();
            }
        }
    }
    class SortThread extends Thread{
        int ms = 0;
        public SortThread(int ms){
            this.ms = ms;
        }
        public void run(){
            try {
                sleep(ms*10+10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(ms);
        }
    }
    <?php
    $pids = array();
    for ($i=1; $i<$argc; $i++)
    {
            if (($pid = pcntl_fork()) == 0)
            {
                    $sleep = intval($argv[$i]);
                    sleep($sleep);
                    echo $sleep."
    ";
                    exit();
            }
            else if ($pid == -1)
            {
                    die();
            }
            else
            {
                    $pids[] = $pid;
            }
    }
    
    foreach($pids as $pid)
            pcntl_waitpid($pid, $status);
    ?>
    
    php sleepsort.php 1 3 5 6 2
    


    下面这个是转载的

    该贴有1000+回复,我挑几个有趣的回复分享下:


    路人A:

    Oh god, it works.

    But I don't like to wait 218382 seconds to sort '(0 218382)

    哦,春哥,它居然能用,但我不想用218382秒去排(0 218382)


    路人B:

    If the difference between any two of the numbers is too small, race conditions will fuck you up the ass.

    如果两个数之间的差距太小,竞态条件就要爆你菊花了。


    路人C:

    What about 
    ./sleepsort -1 -2 -3 ?

    If you slept exp(n) instead of n it could easily include negative integers too!

    排-1 -2 -3怎么办?如果你睡exp(n)而不是n,它就能包含负数了。


    路人D:

    Someone email this to Knuth

    你可以给Knuth发邮件了


    路人E:

    I think thats brilliant :)

    Would be fun to design a hardware sorter, based on this..

    这招挺高,可以根据这个设计一个硬件排序器


    路人F:

    This has a best case O(n) and an infinity high worst case. (because its 0(n * Constant) and the constant could be much greater than n)

    它有一个最好的O(n)的时间复杂度和一个无穷大的最坏复杂度,因为这个常数可能比n大的多的多


    路人G:

    I heartily disagree with all the attempts to downplay the brilliance of the sleep sort algorithm. Many of you have missed the important point that while traditional sorting algorithms can only utilize one core, sleep sort has the capacity to use the full power of a massively parallel execution environment.
    Given that you need nearly no computing in each of the threads, you can implement them using low-power CPUs, so this is in fact a GREEN COMPUTING algorithm.
    Oh, and did I mention that the algorithm can also run inside a cloud...?
    Sure, you're a genius!

    我由衷的不同意那些低估sleepsort这个天才算法的举动,许多人可能忽略了一个重点那就是传统的排序只能利用一个核心,而sleepsort有这个能力充分利用可以做大量并行计算的环境。

    在每个线程中给出你几乎不需要计算的部分,你可以用低性能CPU搞定它们,所以事实上,这是一个“绿色计算”算法。

    还有我提到的这个方法能在云端运行不?

    总之,你是个天才!


    路人H:

    pretty fucking cool !

    真是太TM的cool了!




  • 相关阅读:
    windows类型
    网络编程socket、udp
    mem族函数与str族函数(待填)
    位运算符的用处(待填)
    c51较c比较,单片机最小系统
    数据结构之 顺序栈的操作
    [置顶] 数据结构之 顺序栈的操作
    java中常用的帮助类。加快开发速度
    php实现安装程序的 安装
    php压缩文件帮助类
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3220090.html
Copyright © 2011-2022 走看看