今天看到一个名为《一些因愚蠢而成名的代码》,其中提到了2个排序算法,个人觉得挺有趣的,至于是否“愚蠢”……

下面看第一个排序算法(蓝色背景部分为原文引用):

Bogosort 是一个非常著名的列表排序算法,它是这样的实现原理:
  • 把列表中的元素随机打乱顺序排放
  • 检查是否已经是有序列表了,如果不是,重新开始。
Bogosort 算法平均运行次数为 O((n+1)!),非常糟糕。这也是一个罕见的没有最坏情况下运行次数的算法。如果列表中至少有两个元素,那么它也可能无限时间的执行运算。

个人观点

暂且不论算法好坏,这个算法的思想本身就很有趣了。我们看到,算法的目的是使列表有序,但算法的操作步骤没有一个是向它的目的趋近的。而且,恰恰相反,算法使用了反向思维——以打乱顺序的方式来“排序”——算法成功排序的保障完全依赖于概率。这仿佛很有哲理,背道而驰未必达不到目的地!

再看另一个排序算法(蓝色背景部分为原文引用):

睡眠排序:这是一个在 4chan 上走红的非常简单的代码,它是愚蠢还是巧妙,取决于你怎么来看待它。它背后的逻辑非常简单,下面的它的伪代码:
procedure printNumber(n)
    sleep n seconds
    print n
end
 
for arg in args
    run printNumber(arg) in background
end
wait for all processes to finish

它会为数组中的每一个整数创建一个线程,然后放到后台运行。线程会等待 N 秒然后打印该整数。这意味着最小的数等待时间最短,并最先被打印出来,最大的数等待时间最长并最后打印出来。

换句话说,如果有一个 1 到 20 的数组,随机排序,1 的线程会等待 1 秒,2 的会等待 2秒,依此类推。最终,就会得到排好序的数组。这是一个非常滑稽但却很有效的算法,但目前并没有得到很好的证明,因为它需要硬件的支持。

个人观点

我去!这个排序算法的时间复杂度貌似竟然不依赖排序元素个数,而取决于最大的数是多少,而且几乎所有运行时间都在……sleep。另外,这算法的“美妙”之处在于,它的存在使得线程的 sleep 就好像是为排序而生的一样(^_^)。

posted on 2016-02-04 13:44  Eric Zong  阅读(929)  评论(0)    收藏  举报