内容整编自多个网友的文章,外加上自己的一些感想,链接太多就不一一列举了:)

1. 睡眠排序(Sleep Sort)

睡眠排序也称为硬件排序, 充分利用硬件计时器的资源实现拟态算法(逃

这个事件起源于一个屌丝发表了一个时间复杂度为O(n)的排序算法,睡眠排序的主要逻辑是构造n个线程,它们和这n个数一一对应。初始化后,线程们开始睡眠,等到对应的那么多个时间单位后各自醒来,然后输出对应的数。这样最小的数对应的线程最早醒来,这个数最早被输出。等所有线程都醒来,排序就结束了。能脑洞大开想出此算法的,绝壁天才啊。。。
于是我一本正经地试着实现一下这个Idea:

public class SleepSort {public static void main(String[] args){int[] nums={9,7,2,6,15,8,9,9,9,9,9};SleepSort.sort(nums);for(int n:nums)System.out.printf("%d   ",n);}public static void sort(int[] nums){Sleeper.idx=0;Sleeper.output=new int[nums.length];for(int i=0;i<nums.length;i++)        //[1]new Sleeper(nums[i]).start();for(int i=0;i<nums.length;i++)nums[i]=Sleeper.output[i];}
}
class Sleeper extends Thread{public static int[] output;public static int idx;private int sleep_time;public Sleeper(){this.sleep_time=0;}public Sleeper(int sleep_time){this.sleep_time=sleep_time;}@Overridepublic void run(){try{Thread.sleep(this.sleep_time);}catch(InterruptedException e){e.printStackTrace();}output[idx++]=this.sleep_time;}
}

当然也可以用我大javascript setTimeout 实现:


let nums = [9,7,2,6,15,8,9,9,9,9,9]
, output = []nums.forEach(function (num) {
setTimeout(function () {
output.push(num)
if (output.length == nums.length) {
console.log(output)
}
}, num)
})

算法其实真的很天才,让操作系统来处理排序的复杂度,而且很容易并行起来...不过最大的作用还开脑洞吧;

2. 面条排序(Spaghetti Sort, 意面排序)

首先去买一捆面,是意面挂面还是手擀面请按个人口味决定,最好是硬的。找到数组中最大和最小的两个数(O(n)),让最大的数对应一根很长的面条,最小的数对应一根很短的面条。重新遍历数组,每遇到一个数,就取一根面条,把它切成这个数对应的长度,可以得到n根面条。这里的数与面条长度的对应可以用一个严格递增的函数来映射。接下来,一手握住这n根面条,稍微用力,别握太紧,在平放的桌面上直立着放下,让所有的面条底端接触到桌面。另一只手平行于桌面,从面条上方缓慢往下移动,每当这只手碰到一根面条,移走它,并把对应的数输出到结果数组中,直到移走全部面条。
用完的面条还可以煮夜宵哦。
面条排序的思想基本上跟睡眠排序一样样的,公布程序

#include<iostream>
using namespace std;
int main()
{
int g;
cin>>g;
int a[g],count=0,i,ai;
for (i=0;i<g;i++)
cin>>a[i];
for (i=0;i<g;i++)
{
for (ai=0;i<g;i++)
{
a[ai]--;
if(a[ai]==0)
cout>>count+1;
}
count++;
}
return 0;
}

算法的意义在意,它是一个“算法”。要知道算法的概念远早于计算机,我们的代码都是对“算法”的模拟,也是对自然模拟,就好像数学物理学那样...跳出计算机思维之外,很多的问题都有很直观的解法,你可以认为是有趣的思维实验;

3. 猴子排序(Bogo Sort)

随机打乱数组,检查是否排好序,若是,则输出,否则再次打乱,再检查...最佳情况O(n),平均O(n*n!),最坏可执行直到世界的尽头。
算法代码主体部分基本上就是这样的:

while(! isOrdered(nums))shuffle(nums);

See also 无限猴子定理:一只猴子随机敲打打字机键盘,如果时间足够长,总是能打出特定的文本,比如莎士比亚全集。

注:

猴子那个一开始以为最好不应该是时间复杂度为1,因一次瞎排就得出结果. 但还得查看是否有序,这个过程耗的时,这是那个n

第三个算法,最大的意义也许在于观众看完之后的那句“卧槽这也行”、“这特么什么鬼”...-_-||

完整代码(c++):

#include <iostream>
using namespace std;
int source[10],flag[10],res[10];
int sort(){memset(flag,1,sizeof(flag));int num = 10,count=0;while(num){int t =rand()%10;   //生成0-9之间的数if(flag[t]){res[count++] = source[t];num--;}}for(int i=0;i<9;i++){if(res[i]>res[i+1]){      //只有是从小到大的排列才行return 0;} }return 1;
}
int main(){int count = 0;for(int i=0;i<10;i++){cin>>source[i];}while(sort()!=1){count++;}cout<<"共运行了"<<count<<"次"<<endl;return 0;
}

转载于:https://www.cnblogs.com/jinhengyu/p/10257768.html

睡眠排序、面条排序、猴子排序...........................相关推荐

  1. (不入流的排序算法)------猴子排序

    前言: 这个算法其实没啥使用,现在常用的排序算法(内部排序)还是那十大排序算法,什么快排,归并,堆等等,这个算法可以了解了解. 猴子排序 猴子代表乱的意思,猴子排序的意思就是随机排序,直到有序为止. ...

  2. 奇葩算法系列——量子猴子排序

    之前我们介绍过猴子排序 https://blog.csdn.net/yshuoo/article/details/103831424 猴子排序的思想很简单,但是算法的时间复杂度太慢了,于是有人引入了当 ...

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

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

  4. C++Bogo Sort猴子排序的实现算法(附完整源码)

    C++Bogo Sort猴子排序的实现算法 C++Bogo Sort猴子排序的实现算法完整源码(定义,实现,main函数测试) C++Bogo Sort猴子排序的实现算法完整源码(定义,实现,main ...

  5. 【Java】奇葩的猴子排序

    猴子排序的思想: 是把一个无序的数组进行乱排序,然后看其是否会有序,这是个概率性事件,有可能一次之后就有序了,也有可能很多次后依然无序. (这就是一个玄学问题,呵呵呵呵...) 好吧,下面是代码实现, ...

  6. Python之猴子排序

    猴子排序是一种什么样子的排序呢? 猴子代表乱的意思,猴子排序的意思就是乱排序,直到有序为止. 这个真实的含义就是把一个无序的数组进行乱排序,然后看其是否会有序,这是个概率性事件,有可能一次之后就有序了 ...

  7. 【经典算法】:猴子排序

    猴子排序是一种什么样子的排序呢? 猴子代表乱的意思,猴子排序的意思就是乱排序,直到有序为止. 这个真实的含义就是把一个无序的数组进行乱排序,然后看其是否会有序,这是个概率性事件,有可能一次之后就有序了 ...

  8. 排序算法——猴子排序

    猴子排序 让一群猴子在打印机前昼夜不停地敲打键盘,最终有可能能输入一部莎士比亚作品集--尽管概论微乎其微. 同理,把一堆扑克牌扔到天上,等它们落下来的时候有概率会刚刚好从小到大排成一列. 现在有一个无 ...

  9. 排序算法猴子排序java算法代码实现

    <h1>猴子排序</h1> 原理:现有一组未排序数据和相同数量的方格,然后依次随机地取出数据随机地放入方格中,直到把方格放满即止. 之所以又被称为猴子排序,我的猜测是因为.将这 ...

  10. 猴子排序(Bogo Sort)算法的Java实现

    猴子排序(Bogosort)是一个很有趣也很容易理解的算法,算法的逻辑简单来说就是让一只猴子把写有数字的纸片随机排序,如果猴子排出来的是有序的数组,那么就结束该过程,否则将继续重复这一步骤,直到排出有 ...

最新文章

  1. RHEL系统启动流程
  2. python是c语言写的吗-python是用c写的吗
  3. JS的indexOf
  4. C#全能数据库操作类及调用示例
  5. Python模块之hashlib:提供hash算法
  6. 只运行一个实例的写法
  7. JS replace()方法替换变量(可以对变量进行全文替换)
  8. 好程序员大数据教程分享之Hadoop优缺点
  9. org.springframework.mail.MailAuthenticationException: Authentication failed 解决方案
  10. 不谈商业模式,为什么众筹新闻难成功
  11. 【linux】安装python依赖库confluent_kafka
  12. 服务器远程关机软件,实现远程关机需要哪些步骤?向日葵怎么实现远程关机控制?...
  13. python滚动广告牌,Discovery Live 参数化建模案例-设计广告牌风场选址
  14. 往事如烟 - 老钟15
  15. iOS11 增加的新技能
  16. OpenHarmony LiteOS C-SKY指令集移植指北
  17. 体声波(BAW)射频滤波器行业调研报告 - 市场现状分析与发展前景预测
  18. V_rep与vs2019开发环境配置
  19. 美团数据分析岗面试题+解题思路
  20. PHP学习之类和对象

热门文章

  1. gin--简单的登录界面的实现
  2. pythonATM,购物车项目实战_补充3——core模块
  3. python处理json数据(复杂的json转化成嵌套字典并处理)
  4. Tomcat配置两个应用服务
  5. postgis java_Postgresql结合postgis使用java的JDBC连接
  6. threadlocal原理_Java并发编程——揭开ThreadLocal的面纱
  7. kettle将文件路径定义为_Kettle变量和自己定义java代码的实例应用
  8. 慕课python七月_【慕课有约】七月老师:关于小程序的那些事
  9. 蚂蚁金服“定损宝”现身AI顶级会议NeurIPS
  10. 巧用CSS居中未知高度的块元素