python实现猴子排序(Monkey_sort)闲聊睡眠排序

来源:互联网 发布:淘宝账号如何绑定手机 编辑:程序博客网 时间:2024/05/21 14:48

     遥想本科的时候刚开始学习数据结构的时候所有的排序算法无非就是:归并排序、冒泡排序、快速排序、归并排序、堆排序、插入排序、选择排序等几种了,其中归并排序、快速排序、堆排序可以说是最受推崇的性能比较好的几种算法了,现在的排序算法很多也很新颖,抽时间也得了解一下,可能学校时期学习的都是经典中的经典以至于很多不是很好的排序算法没有被熟知,比如说:猴子排序和睡眠排序,这两个算法在我第一次看到的时候直接就被名字吸引住了,正经的,然后看了一下网上的介绍,瞬间感觉有点扯啊,不知道有没有同感。

    先说睡眠排序吧,这个排序算法由于看完之后感觉实际实现价值不大就只说一下自己的理解不写代码了,比如给定一个带排序列表,中间有n个元素 ,那么睡眠排序在算法开始的时候会设置n个线程,让n个分别对应与n个数字,这就是算法的初始准备阶段了,之后会为每一个线程设置该数字对应的休眠时间,休眠时间肯定有大小啊,谁的休眠时间先结束谁就先输出,直至最后一个数字输出结束为止,这就是休眠时间就跟爬虫休眠时间一个性质的,但是我就想问一句如果里面很大一个数字,是不是程序永远跑不完了,这个真的是思想有点飘忽,哈哈哈,所以,就略过吧.....

    今天就简单学习一下猴子排序,主要是看到名字很有意思才想着来学一下。猴子排序的思想很简单,名字主要来源于一个笑话,一只猴子在键盘面前敲击总有一次机会能够完全输入对,比如可能花费几十年输出了一本诗集,把这个思想用在排序中就更简单易懂了,就是在最开始判断是否列表已经有序,如果有序直接输出,无序的话开始循环,每一次都随机打乱列表中的数值然后判断是否有序,如果有序则输出,算法终止,否则继续进行下去,思想很简单。

    在实现了算法的时候我不禁感叹,这样的算法也真是够“创造性“的啊,实现的时候选的是python,主要感觉顺手,还有随机打乱列表正好有可以使用的现成的模块,不过实现的时候出现了一点小插曲,就是random的shuffle方法没有用对,导致IDE都没有响应了,内存一下子飙升到了95%,很是尴尬啊,吓得我赶紧终止进程了,接下来修改一下就可以了,很简单,核心代码就一句话:random.shuffle(num_list),下面看具体实现:

#!/usr/bin/env python#encoding: utf-8'''__Author__:沂水寒城功能:实现猴子排序'''import timeimport randomdef randomnumber_generate(total_num=100, max_num=1000):    '''    随机数列表生成器    '''    num_list = []    n = 1 #得到1000以内的100个随机数    while n <= total_num:        lin = random.randint(0, max_num)        num_list.append(lin)        n += 1    return num_listdef monkey_sort_test(num_list):    '''    猴子排序,思想是:每次都随机打乱数组,直到有序为止    '''    result_list=sorted(num_list)    if num_list==result_list:        pass    else:        while num_list!=result_list:            random.shuffle(num_list)    return num_list    def main_func(total_num=5, max_num=10):    '''    主调用函数    '''    print '---------------------------------------------------------------------------'    num_list=randomnumber_generate(total_num, max_num)    print '待排序的列表为:', num_list    start_time=time.time()    result_list=monkey_sort_test(num_list)    end_time=time.time()    print '排序好的列表为:', result_list    print '排序总共耗时为:', end_time-start_timeif __name__ == '__main__':    main_func(total_num=5, max_num=10)    main_func(total_num=10, max_num=50)    main_func(total_num=15, max_num=100)

    结果1如下:

---------------------------------------------------------------------------待排序的列表为: [3, 10, 2, 6, 5]排序好的列表为: [2, 3, 5, 6, 10]排序总共耗时为: 0.000555992126465---------------------------------------------------------------------------待排序的列表为: [5, 46, 36, 48, 12, 17, 14, 35, 30, 16]排序好的列表为: [5, 12, 14, 16, 17, 30, 35, 36, 46, 48]排序总共耗时为: 27.1962878704---------------------------------------------------------------------------待排序的列表为: [9, 76, 90, 75, 10, 38, 62, 22, 63, 71, 54, 9, 47, 28, 65]

    结果2如下:

---------------------------------------------------------------------------待排序的列表为: [3, 9, 9, 1, 5]排序好的列表为: [1, 3, 5, 9, 9]排序总共耗时为: 0.000125169754028---------------------------------------------------------------------------待排序的列表为: [8, 35, 43, 20, 46, 8, 3, 41, 32, 5]排序好的列表为: [3, 5, 8, 8, 20, 32, 35, 41, 43, 46]排序总共耗时为: 0.226416110992---------------------------------------------------------------------------待排序的列表为: [84, 65, 2, 21, 77, 30, 78, 76, 21, 57, 56, 93, 11, 25, 64]

   额......

    不要问我为什么最后一项结果不完整,因为我真的已经等不下去了,机器都要发烫了还是跑不出来,这样的算法还是娱乐一下就好了,不能当真,很吓人的,最开始我是拿的50个数字跑的,结果等了半个小时没有东西出来,然后改成30,改成20后来又改成了15,依旧是没有结果输出,可见当数据量增长的时候,时间性能几乎是崩溃式地衰退啊,着实很尴尬,这个结果嘛,就这样了吧,如果感兴趣可以自己跑一下,如果不介意的话顺便告诉我一下结果哈,我补充上去好了

    虽然代码写的不怎么样,但是我所有的代码都是会附上运行结果的,而且都是拿去就可以运行的,感觉这样的话看一个介绍、看一个原理、看一个算法才是一个完整的流程了,可能我自己就是太喜欢看到结果是怎么样子或者中间输出是什么样的才能理解吧。

    最后,欢迎交流!