介绍几个不实用的排序算法,一来可以在学习时增加一些乐趣,放松一下自己,二来可以学习一下、思考一下这些算法失败在哪里,又是否存在一些好的地方?

睡眠排序

这是一个思想比较简单,脑洞巨大的算法 -- 我们知道sleep方法可以让一个线程睡眠s毫秒,如果需要对一个有n个数的数列进行排序,我们何不为每个数创建一个线程,然后让每个线程都睡眠该数的时间,那么对于越小的数,其睡眠时间越短,越大的数,其睡眠时间越长,最后就使得所有元素完成“排序”了

1 public void sleepSort(int[] arr){2

3 /**创建线程类*/

4 class Slee extendsThread{5

6 private inttime;7

8 public Slee(inttime){9 this.time=time;10 }11

12 public voidrun(){13 try{14 /*因为毫秒时间太短 如果两个数相差比较小 完成不了排序 建议乘一个系数 比如10*/

15 Thread.sleep(time*10);16 } catch(InterruptedException e) {17 e.printStackTrace();18 }19 System.out.print(time+", ");20 }21 }22

23 /*排序*/

24 for (int i = 0; i < arr.length; i++) {25 newSlee(arr[i]).start();26 }27 }

猴子排序(随机排序)

猴子排序引用了无限猴子定理:即一只猴子随机不停的敲击键盘,如果时间足够长,那么它总有可能会打出特定的文本,比如莎士比亚全集?,算法通过不停的随机排列数组,直到数组有序

/*判断一个数列是否有序*/

public boolean isSort(int[] arr){for (int i = 0; i < arr.length-1; i++) {if(arr[i+1]

}

}return true;

}public void monkeySort(int[] arr){int count=0;

Random random=newRandom();do{/*从待排序数组右边随机抽取一位数与左边进行交换*/

for (int i = 0; i < arr.length-1; i++) {

count++;int t=(random.nextInt(arr.length-i)+i);int tmp=arr[i];

arr[i]=arr[t];

arr[t]=tmp;

}

}while(!isSort(arr));

System.out.println(count+" "+Arrays.toString(arr));

}

珠排序

我们知道,在重力的作用下,如果将算盘立起来,无论怎么拨动,算珠最终都会掉下来紧挨在一起,那如果每根柱子上的算珠个数不太一样呢?见图片

如图,我们看到神奇的重力已经帮我们排好序了?那如何将此现象写成代码呢?我们用一个二维数组模拟整个算盘,每一个数拥有一行算珠

见代码

1 /*

2 * 一串串珠子 如下 最上面的珠子会往下掉 变成下图3 * ******** *4 * **** | **5 * ****** \|/ ****6 * ** . ******7 * * ********8 * 用二位数组将数字模拟成珠子9 */

10 public void pearlSort(int[] arr) {11 int min=arr[0];12 int max=arr[0];13 for (int i = 0; i < arr.length; i++) {14 if(min>arr[i]) {15 min=arr[i];16 }17 if(max

22 /*

23 * 定义二维数组24 */

25 int[][] pal=new int[arr.length][max-min+1];26 /*

27 * 给二维数组串上珠子28 */

29 for (int i = 0; i < pal.length; i++) {30 for (int j = 0; j < arr[i]-min; j++) {31 pal[i][j]=1;32 }33 pal[i][pal[i].length-1]=arr[i];34 }35

36 /*

37 * 珠子往下落38 */

39 for (int i = 0; i < pal.length; i++) {40 for (int v = pal.length-1-i; v > 0; v--) {41 for (int j = 0; j < pal[v].length-1; j++) {42 if(pal[v][j]!=0&&pal[v-1][j]==0) {43 pal[v][j]=0;44 pal[v][pal[v].length-1]--;45 pal[v-1][j]=1;46 pal[v-1][pal[v].length-1]++;47 }48 }49 }50 /*

51 * 依次将剩余的最大值赋给原数组52 */

53 arr[arr.length-1-i]=pal[i][pal[i].length-1];54 }55 }

面条排序

如果桌子上有一把长短不一的面条,此时你将面条立起来,下端平放在桌面上,此时你用手掌在空中从上往下缓慢移动,慢慢的,你的手掌触碰到了一根面条(这根面条是最高的),你将这根面条抽走(抽走的面条当然想怎么吃就怎么吃),手继续慢慢向下移动,这是,你又碰到了倒数第二高的面条,你又将其抽走,。。。。

算法中,我们用一个数模拟手,每次-1,为了不至于手掌无处安放,我们将手直接放在最高的面条的顶端

代码

public void noodleSort(int[] arr) {/**模拟手*/

int hand=arr[0];/**获取最小值 模拟桌子 防止手一直运动*/

int min=arr[0];/**将最大值赋给变量*/

for (int i = 0; i < arr.length; i++) {if(hand

hand=arr[i];

}if(min>arr[i]) {

min=arr[i];

}

}for (int i = arr.length-1; hand>=min; hand--) {for (int j = 0; j <= i; j++) {if(hand==arr[j]) {/**j为什么要-- 防止交换的数字本身也等于hand*/arr[j--]=arr[i];

arr[i--]=hand;

}

}

}

}

对于这些似乎玩笑性的排序算法,除了睡眠排序,我几乎没有找到相关源码,这些源码是我尝试着去写的,并为其做个小总结,也是为了能给一些人做个借鉴,当然如果有地方写的不好,或者有什么问题与意见,欢迎大家提出来

java实现猴子排序_Java排序 - 不实用的几个排序算法 -- 睡眠排序、猴子排序、面条排序、珠排序...相关推荐

  1. java循环左一_java实现循环左移和右移的简单算法

    java实现循环左移和右移的简单算法 byte a=112,用程序实现,将其循环左移三位和右移三位. 112的二进制原码:0111 0000 112循环左移3位后的二进制码:1000 0011 112 ...

  2. java所有的质因数_Java实现分解任意输入数的质因数算法示例

    本文实例讲述了java实现分解任意输入数的质因数算法.分享给大家供大家参考,具体如下: 分解任意输入数的质因数: 质因数概念:任何一个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数, ...

  3. java质因数的分解_Java实现分解任意输入数的质因数算法示例

    本文实例讲述了Java实现分解任意输入数的质因数算法.分享给大家供大家参考,具体如下: 分解任意输入数的质因数: 质因数概念:任何一个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数, ...

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

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

  5. java 排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  6. java collections.sort 忽略大小写排序_Java Spring Mongo排序忽略大小写问题

    我正在使用Spring-Data-mongodb对MongoDB执行各种请求. 尝试执行分页&时用忽略的情况排序我得到一个例外, 这是我的代码: Sort.Order order = new ...

  7. java 怎么自定义排序_Java如何实现List自定义排序

    Java如何实现List自定义排序,自定义,即为,详细内容,相关文章,更多关于 Java如何实现List自定义排序 易采站长站,站长之家为您整理了Java如何实现List自定义排序的相关内容. 实体类 ...

  8. java中queue排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  9. java的排序_java排序

    Bubble sort 冒泡排序 一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经 ...

  10. java二维整型数组 各行和排序_java:已知我有一个二维数组,直接输入全部数据,怎么对数组的每行进行升序排序...

    展开全部 书写完毕,采纳即可. import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; publ ...

最新文章

  1. mysql_cluster
  2. 第二届全国大学生智能汽车竞赛获奖名单
  3. python中参数(带星号的参数)
  4. 【SpringBoot集成ElasticSearch 02】Java HTTP Rest client for ElasticSearch Jest 客户端集成(配置+增删改查测试源码)【推荐使用】
  5. 蓝桥杯历届试题 剪格子 (DFS)
  6. Python之在函数中使用列表作为默认参数
  7. SAP CDS view 单元测试框架 Test Double 介绍
  8. android最新知识点总结,学习android之 知识点总结
  9. 语法推导树之短语,直接短语,句柄
  10. Deep Learning 10_深度学习UFLDL教程:Convolution and Pooling_exercise(斯坦福大学深度学习教程)...
  11. 漫画:如何给女朋友解释为什么200M宽带,打王者荣耀还是会有460的延迟?
  12. KVM命令行使用工具(virsh)详解。
  13. 【5分钟paper】基于强化学习的策略搜索算法的自主直升机控制
  14. python_文件处理模式
  15. 用xml模块方式导出多种offcie文件
  16. linetv_LINE TV台湾版
  17. 计算机网申兴趣爱好怎么写,网申简历中的特长爱好到底怎么写
  18. 《羊年展望》中国改革蹄疾经济求稳 新思维应对新常态
  19. 五款开源图像处理软件
  20. RSD的面向对象分类设计

热门文章

  1. Windows主机和Linux主机之间连接网线共享网络上网设置
  2. Configure Python interpreter
  3. penghui_031413 Bat命令学习
  4. python控制苹果手机触摸屏失灵怎么办_苹果6sp屏幕失灵怎么办 这些解决方法绝对最易学...
  5. 补充:消除epsilon产生式等
  6. 唱作俱佳,腾讯AI艾灵领唱中国新儿歌
  7. 在win10中加载ISO文件到虚拟光驱
  8. Vant_根据已有地址获取code
  9. python二级真题--共十二套--前六套--选择题
  10. 力扣刷题 DAY_81 贪心