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

睡眠排序

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

 1     public void sleepSort(int[] arr){
 2
 3         /** 创建线程类 */
 4         class Slee extends Thread{
 5
 6             private int time;
 7
 8             public Slee(int time){
 9                 this.time=time;
10             }
11
12             public void run(){
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             new Slee(arr[i]).start();
26         }
27     }

猴子排序(随机排序)

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

    /* 判断一个数列是否有序 */public boolean isSort(int[] arr){for (int i = 0; i < arr.length-1; i++) {if(arr[i+1]<arr[i]){return false;}}return true;}public void monkeySort(int[] arr){int count=0;Random random=new Random();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<arr[i]) {
18                 max=arr[i];
19             }
20         }
21
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<arr[i]) {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;}}}}


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

转载于:https://www.cnblogs.com/wangbingc/p/10205560.html

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

  1. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  2. 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序

    第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...

  3. Java对List集合中的对象的某个中文字段按照拼音首字母进行排序

    徐师兄这次开门见山上代码!由于没时间整理直接controller层写了一个测试代码 @RequestMapping(value = "/get", method = Request ...

  4. Javascript对HTML表格排序-很实用

    Javascript对HTML表格排序-很实用 Javascript实现HTML表格排序,点击表头的标题单元格,即可对该列排序,升序降序切换,数字.文本都可以排序. 先看下面的效果图: 该功能已经封装 ...

  5. 数据结构-考研难点代码突破(C/C++/Java排序算法,性能及其稳定性分析(内部排序))

    文章目录 1. 内部排序的基本种类 2. 插入排序 Ⅰ直接插入排序 性能与稳定性分析 Ⅱ 折半插入排序 性能与稳定性分析 Ⅲ 希尔排序 性能与稳定性分析 3. 交换排序 Ⅰ 冒泡排序 性能与稳定性分析 ...

  6. access两字段同时升序排序_7 天时间,我整理并实现了这 9 种常见的排序算法

    排序算法 回顾 我们前面已经介绍了 3 种最常见的排序算法: java 实现冒泡排序讲解 QuickSort 快速排序到底快在哪里? SelectionSort 选择排序算法详解(java 实现) 然 ...

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

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

  8. c++排序数组下标_看动画学算法之:排序 - 基数排序

    简介 之前的文章我们讲了count排序,但是count排序有个限制,因为count数组是有限的,如果数组中的元素范围过大,使用count排序是不现实的,其时间复杂度会膨胀. 而解决大范围的元素排序的办 ...

  9. Hark的数据结构与算法练习之珠排序

    ---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦.  大家看一 ...

最新文章

  1. 【学习笔记】《数据挖掘:理论与算法》CH4神经网络
  2. 网络请求之优化参数添加工具类自定义Map类
  3. 用户态和核心态的转换
  4. java resourse 报错_java.nio.file.InvalidPathException: Illegal char :
  5. 利用JDK1.5的工具对远程的Java应用程序进行监测(摘录)
  6. HackerOne漏洞奖励计划扩展至开源漏洞
  7. python神经网络编程 豆瓣,神经网络算法python实现
  8. Android手机SD卡分区
  9. 微前端框架 之 qiankun
  10. 微信开发者工具button,input鼠标点击坐标偏移
  11. “万丈高楼平地起,编程学习要趁早”
  12. 两个用于谷歌输入法的颜文字拓展
  13. js 微信公众号开发chooseWXPay:fail, the permission value is offline verifying
  14. 玩转华为数据中心交换机系列 | 配置VLAN内协议报文透传示例
  15. archlinux安装kde常见的问题(无法登录,黑屏,无法调节亮度等)
  16. IDAC(电流型DAC)的参数和性能测试
  17. 【报错】fatal: unable to access
  18. 1.2 Activity 的基本用法大全
  19. 向假视频宣战!研究人员开发出了鉴定假视频的“照妖镜”
  20. 信息系统项目管理师案例分析万金油

热门文章

  1. JBOSS配置系统应用的端口号
  2. [转载]WPF窗口跳转及window和page区别
  3. Distance计算的距离随经纬度不同
  4. 初学者选黑卡还是微单_入门单反和微单相机该买哪个
  5. javaee, javaweb和javase的区别以及各自的知识体系
  6. 更新版PowerBI发布了-- Power BI Report Server Update – March 2018
  7. MySQL查询结果复制到新表(更新、插入)
  8. 验证用户名是否存在,手机号是否匹配,进而修改密码
  9. 使用代码生成建立可扩展序列化器(上)
  10. Go程序性能分析pprof