1. 程式人生 > >天才排序演算法:睡眠排序

天才排序演算法:睡眠排序

今天看到一個帖子,帖名叫《Genius sorting algorithm: Sleep sort》。看過之後感覺雖然實用價值不高,但挺受啟發的,重點是它實在是太歡樂了。

樓主:

Man, am I a genius. Check out this sorting algorithm I just invented.
朋友,我真是個天才,快來看看我剛發明的排序演算法。

#!/bin/bashfunction 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

再帖幾個其他常用版本,以便擅長不同語言的朋友閱讀:

JAVA版:

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版:
<?php
$pids = array();
for ($i=1; $i<$argc; $i++)
{
        if (($pid = pcntl_fork()) == 0)
        {
                $sleep = intval($argv[$i]);
                sleep($sleep);
                echo $sleep."\n";
                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

JS版:

// Javascript

function lazySort(list, callback) {
    var result = [];

    list.forEach(function(i) {
        setTimeout(function() {
            result.push(i);
            
            if(result.length == list.length) {
                callback(result);
            }
        }, i);
    });
}

lazySort([4,5,7,1,2,4,5], alert);

Ruby版:
ARGV.each { |e| fork { sleep(e.to_f/1000); puts e } }
還有很多冷門語言版本,感興趣朋友可以點文後的連結

該貼有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了!

==================================================================================================

  作者:nash_  歡迎轉載,與人分享是進步的源泉!

===================================================================================================