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

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

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

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

#!/usr/bin/env python
#encoding: utf-8
'''
__Author__:沂水寒城
功能:实现猴子排序
'''
import time
import random
def 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_list
def 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_time
if __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,依旧是没有结果输出,可见当数据量增长的时候,时间性能几乎是崩溃式地衰退啊,着实很尴尬,这个结果嘛,就这样了吧,如果感兴趣可以自己跑一下,如果不介意的话顺便告诉我一下结果哈,我补充上去好了

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

最后,欢迎交流!

python实现猴子排序(Monkey_sort)闲聊睡眠排序相关推荐

  1. JAVA排序算法之“睡眠排序”

    代码如下 public class SellpSort {public static void main(String[] args){int[] ints = {1,3,5,6,8,22,11,0, ...

  2. js排序算法之睡眠排序

    const arr = [1, 8, 5, 6, 4, 4, 5, 3] const arr2 = [] arr.forEach((i) => setTimeout(() => arr2. ...

  3. # 睡眠3秒_【for fun】睡眠排序算法

    点击上方蓝字关注我,我们一起学编程有任何疑问或者想看的内容,欢迎私信 前天我们一起看了猴子排序,今天我们再来看一个奇葩的排序方法:睡眠排序. 所谓睡眠排序,就是为待排序数组的每一个元素 x 启动一个线 ...

  4. Java排序 - 不实用的几个排序算法 -- 睡眠排序、猴子排序、面条排序、珠排序...

    介绍几个不实用的排序算法,一来可以在学习时增加一些乐趣,放松一下自己,二来可以学习一下.思考一下这些算法失败在哪里,又是否存在一些好的地方? 睡眠排序 这是一个思想比较简单,脑洞巨大的算法 -- 我们 ...

  5. 【代码】睡眠排序python实现

    在逛知乎时,碰巧发现这样一个问题除了经典和常用的排序算法外,还有哪些奇葩而有趣的排序算法?,里面出现了一个名叫睡眠排序的算法,真的是脑洞大开,特此来实现一下. 一点历史,原帖是2014年Reddit上 ...

  6. python八大选择排序_Python实现选择排序

    选择排序: 选择排序(Selection sort)是一种简单直观的 排序算法 .它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最 ...

  7. 排序算法--睡眠排序

    我们学数据结构的时候会学到多种排序算法,基本上都是基于比较的排序,下面的这个排序算法并不是基于比较,确切的说它是基于cpu调度算法实现的,这个算法的作者称之为--睡眠排序. 它的基本思想是,对一组数据 ...

  8. python 多维数组(array)排序

    原文:https://blog.csdn.net/daoxiaxingcai46/article/details/78391169 python 多维数组(array)排序 关于多维数组如何复合排序 ...

  9. python中字典按键或键值排序

    字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按"键"排 ...

  10. 如何在python中对列表套列表进行排序_如何实现对Python中列表的排序?

    对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Py ...

最新文章

  1. struts2中使用标签操作静态方法等
  2. java生成横向的pdf,java – 如何生成横向跨越多个页面的PDF报告
  3. Docker源码分析(三):Docker Daemon启动
  4. 关于MySQL的各种总结
  5. Traumland--梦乡--IPA--德语
  6. 批量kill掉linux中符合某些字段的进程
  7. UVA 12563 Jin Ge Jin Qu hao
  8. LeetCode 22. 括号生成(回溯/DP)
  9. 前端局部自动刷新_jQuery实现AJAX定时刷新局部页面实例
  10. Maven 私服的简单使用
  11. Rust : codewars的Product of consecutive Fib numbers
  12. java 编辑pdf表格_Java 生成pdf表格文档
  13. MMA算法的推导及3D简支梁拓扑优化代码详解
  14. 衡水十四中2021高考成绩查询,心之所向,行必能至|衡水市第十四中学召开2021高考倒计时200天动...
  15. MPU9250传感器
  16. 将手机流氓软件彻底赶出去
  17. 影响一生的32步电影
  18. 尺取法(图文解析、初学推荐)
  19. 适合零基础学习者的Java学习路线图到底长啥样?一篇文章带你学会Java
  20. MC.9,库存分析,LIS之乱谈一气

热门文章

  1. 区块链安全:基于区块链网络攻击的方式原理详解
  2. 前端性能优化—js代码打包 1
  3. python 回溯法 子集树模板 系列 —— 17、找零问题
  4. 在KVM虚拟机中使用spice系列之二(USB映射,SSL,密码,多客户端支持)
  5. ubuntu下MySQL的安装及远程连接配置(转)
  6. 洛谷P4548 [CTSC2006]歌唱王国(概率生成函数)
  7. MATLAB中施密特正交化的实现
  8. OC学习3——C语言特性之指针
  9. VMware安装Linux系统
  10. 转 Android adb root权限