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

睡眠排序

这是一个思想比较简单,脑洞巨大的算法 -- 我们知道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. }

猴子排序(随机排序)

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

  1. /* 判断一个数列是否有序 */
  2. public boolean isSort(int[] arr){
  3. for (int i = 0; i < arr.length-1; i++) {
  4. if(arr[i+1]<arr[i]){
  5. return false;
  6. }
  7. }
  8. return true;
  9. }
  10.  
  11. public void monkeySort(int[] arr){
  12. int count=0;
  13. Random random=new Random();
  14. do{
  15. /* 从待排序数组右边随机抽取一位数与左边进行交换*/
  16. for (int i = 0; i < arr.length-1; i++) {
  17. count++;
  18. int t=(random.nextInt(arr.length-i)+i);
  19. int tmp=arr[i];
  20. arr[i]=arr[t];
  21. arr[t]=tmp;
  22. }
  23. }while(!isSort(arr));
  24.  
  25. System.out.println(count+" "+Arrays.toString(arr));
  26. }

珠排序

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

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

见代码

  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,为了不至于手掌无处安放,我们将手直接放在最高的面条的顶端

代码

  1. public void noodleSort(int[] arr) {
  2. /** 模拟手 */
  3. int hand=arr[0];
  4. /** 获取最小值 模拟桌子 防止手一直运动*/
  5. int min=arr[0];
  6. /** 将最大值赋给变量 */
  7. for (int i = 0; i < arr.length; i++) {
  8. if(hand<arr[i]) {
  9. hand=arr[i];
  10. }
  11. if(min>arr[i]) {
  12. min=arr[i];
  13. }
  14. }
  15.  
  16. for (int i = arr.length-1; hand>=min; hand--) {
  17. for (int j = 0; j <= i; j++) {
  18. if(hand==arr[j]) {
  19. /** j为什么要-- 防止交换的数字本身也等于hand */
  20. arr[j--]=arr[i];
  21. arr[i--]=hand;
  22. }
  23. }
  24. }
  25. }

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

Java排序 - 不实用的几个排序算法 -- 睡眠排序、猴子排序、面条排序、珠排序的更多相关文章

  1. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  2. Java常用排序算法+程序员必须掌握的8大排序算法

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  3. Java 常用排序算法/程序员必须掌握的 8大排序算法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...

  4. java中list集合的内容,如何使用像数据库中group by形式那样排序

    java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name    mone ...

  5. Java实现 蓝桥杯 算法训练 第五次作业:字符串排序

    试题 算法训练 第五次作业:字符串排序 问题描述 输入一个小写字符串,按从小到大的顺序输出. 输入格式 bcaed 输出格式 abcde 顶格输出,中间没有空格 样例输入 一个满足题目要求的输入范例. ...

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

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

  7. 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较

    我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...

  8. JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

  9. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

随机推荐

  1. (转) qt: usb热插拔(linux);

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...

  2. 随机逻辑回归random logistic regression-特征筛选

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  3. js下拉框:从数组中筛选出匹配的数据

    handleChange(val) { let obj = {} // 遍历数组 obj = this.options.find(item => { // 筛选出匹配的数据 return ite ...

  4. 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

    博文转至:http://www.jianshu.com/p/3667157d63bb,转本博文的目的就是需要的时候以防忘记 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题 ...

  5. 打开即时通讯服务器openfire的大门

    1.什么是即时通讯 你现在最常用的软件是什么,如果我没有猜错,应该是QQ和微信,是的,他们就是即时通讯软件. 一个可以让你无时无刻,只要有网络就能够沟通的工具,就是即时通讯工具.那么本教程,我们主要以 ...

  6. go [第一篇]初识

    [第一篇] 简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发 ...

  7. egret中三种单利的写法。

    1 普通的单例写法 缺点:每个单例类里都要写instance和getInstance. class Single{ private static instance:Single; public sta ...

  8. 友盟统计单页面应用vue

    根据友盟官方提示在index.html的body标签末尾加入相关代码后: 后来发现,由于项目为单页面应用,在路由发生跳转时(到其他页面了),并不会重新将新页面加入统计中.需要在App.vue页面中,监 ...

  9. 论文阅读笔记(七)YOLO

    You Only Look Once: Unified, Real-Time Object Detection Joseph Redmon, CVPR, 2016 1. 之前的目标检测工作将分类器用作 ...

  10. C# - 设计模式 - 虚模式

    虚模式 问题场景 子类从抽象派生是为了解耦,但为了适应新的变化,可能需要向抽象类添加新功能,假如在添加新功能之前已经有100个子类实现了抽象,那么接下来你得在100个子类中去重写向抽象添加的新功能. ...