Sleep sort

4chan BBS 上一个排序的程序火了,它叫休眠排序,很有意思。

[bash]

!/bin/bash

function f() {
sleep “$1”
echo “$1”
}
while [ -n “$1” ]
do
f “$1” &
shift
done
wait

[/bash]

其实它的原理很简单,就是,要对N个整数进行排序的话,启动N个进程(线程),每个进程休眠对应的整数指定的秒数,然后再打印该数,最后你在终端上看到的肯定是排序之后的结果了……看了之后你会不会也觉得这太坑爹了?!可是,它就是能工作,而且占用CPU很少!

值得一提的是底下回复中给出的OpenMP版本(如果要尝试的话需要安装openmpi)和Perl版本。

[c]
/*

  • @file sleepsort.c
  • @brief sorts numbers
    *
  • @compile gcc sleepsort.c -fopenmp -o sleepsort
    *
  • @author Gerald Jay Sussman (Massachvsetts Institvte of Technology)
    */

include

include

include

int main(int argc, char **argv) {
int i;

omp_set_num_threads(argc);

pragma omp parallel for

for (i = 0; i < argc - 1; i++) {
long int this = atol(argv[i+1]);

sleep(this);

printf(&quot;%ldn&quot;, this);
fflush(stdout);

}

return 0;
}

[/c]
[perl]
fork and sleep $_, say, last for @ARGV; 1 while 1 -wait
[/perl]

除了不能对浮点数和负数进行排序,它还有一个缺点,那就是其中某个进程需要睡眠最大的那个数指定的时间,然后才能得出最后结果。下面有人提出了改进,我试了试,没有一个完美的。理想的情况下它应该能够对正负整数、浮点数进行排序,而且最坏也不要花太多时间,感兴趣的同学可以自己改进一下。