脑洞大开的算法

Table of Contents

最后更新时间:2017-03-03

1. sleep 排序

对一个由数字组成的无序的数组做排序。

创建和数组元素一样多的线程,每个线程都 sleep,时长就是对应的数,数字越大,线程阻塞的时间就越长。

实现代码如下:

from time import sleep
import threading


def sleep_sort(n):
    sleep(n)
    print(n)                    # 屏幕打印出的顺序就是已排序好的


target = [1, 3, 8, 4, 9, 10, 3, 20, 5]

for i in target:
    thread = threading.Thread(target=sleep_sort, args=(i,))
    thread.start()

Common Lisp 版本:

(defun sleep-sort(n)
    (sleep (/ n 10))
    (format t "~a~%" n))

(loop for i in '(1 3 8 4 9 10 3 20 5) do
      (sb-thread:make-thread (lambda () (sleep-sort i))))

(loop while (not (null (cdr (sb-thread:list-all-threads)))))

其他语言的实现参考:https://rosettacode.org/wiki/Sorting_algorithms/Sleep_sort

2. bogo(猴子)排序

让一只猴子在打字机上乱敲按键,按键时间达到无穷时,也能打出一部莎士比亚全集。——无限猴子定理

这是种效率极低的排序算法,随机打乱集合中数字的顺序,只要你有足够的耐心等待,迟早会排列正确的。

from random import shuffle


def bogo_sort(array):
    pos_list = range(1, len(array))

    while not all(array[p] > array[p - 1] for p in pos_list):
        shuffle(array)

    return array


if __name__ == '__main__':
    print(bogo_sort([10, 4, 1, 5, 9, 8, 3, 6]))

其他语言实现参考:https://zh.wikipedia.org/wiki/Bogo%E6%8E%92%E5%BA%8F