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("%ldn", this);
fflush(stdout);
}
return 0;
}
[/c]
[perl]
fork and sleep $_, say, last for @ARGV; 1 while 1 -wait
[/perl]
除了不能对浮点数和负数进行排序,它还有一个缺点,那就是其中某个进程需要睡眠最大的那个数指定的时间,然后才能得出最后结果。下面有人提出了改进,我试了试,没有一个完美的。理想的情况下它应该能够对正负整数、浮点数进行排序,而且最坏也不要花太多时间,感兴趣的同学可以自己改进一下。