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

睡眠排序

这是一个思想比较简单,脑洞巨大的算法 -- 我们知道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. 题目1197:奇偶校验
  2. 关于投资银行和咨询的理解和感悟
  3. 除零中断是什么意思?_百万并发「零拷贝」技术系列之初探门径
  4. JVM之类加载器ClassLoader
  5. 在SAP CRM WebClient UI中用javascript触发ABAP event
  6. 簇的局部变量中布尔类型_java基础2(变量、常量、数据类型)
  7. IOT(Index Organized Table)
  8. 项目部署—Linux命令安装redis
  9. ROS笔记(10) TF坐标
  10. 典型的SPI控制器的结构
  11. Numpy——数组合并
  12. oracle开发的小技巧(原创)
  13. kakfa从入门到放弃(四): 分区和副本机制、高级与低级API、 kafka-eagle、原理、数据清理、限速
  14. CAD迷你看图软件中怎么进行实时缩放建筑图纸的大小?
  15. 华为笔记本重装系统步骤
  16. 粒子滤波与重要性采样
  17. 学习 Linux 的最佳方式
  18. call()的具体使用方法
  19. java ios des加密解密_IOS、java支持DES加密
  20. 天弘基金移动App客户端架构优化之路

热门文章

  1. 软件工程到底是干嘛的....
  2. hdoj 4450 Draw Something 水题
  3. HDU 1269 移动城堡 联通分量 Tarjan
  4. 用户名 不在 sudoers文件中,此事将被报告
  5. JQuery Tab菜单的实现
  6. BS开发中常用的Javascript技术
  7. Centos 更改系统时间
  8. Bellman-Ford
  9. AngularJS模块——module
  10. 一个函数两个return