Java排序 - 不实用的几个排序算法 -- 睡眠排序、猴子排序、面条排序、珠排序
介绍几个不实用的排序算法,一来可以在学习时增加一些乐趣,放松一下自己,二来可以学习一下、思考一下这些算法失败在哪里,又是否存在一些好的地方?
睡眠排序
这是一个思想比较简单,脑洞巨大的算法 -- 我们知道sleep方法可以让一个线程睡眠s毫秒,如果需要对一个有n个数的数列进行排序,我们何不为每个数创建一个线程,然后让每个线程都睡眠该数的时间,那么对于越小的数,其睡眠时间越短,越大的数,其睡眠时间越长,最后就使得所有元素完成“排序”了
public void sleepSort(int[] arr){
/** 创建线程类 */
class Slee extends Thread{
private int time;
public Slee(int time){
this.time=time;
}
public void run(){
try {
/* 因为毫秒时间太短 如果两个数相差比较小 完成不了排序 建议乘一个系数 比如10 */
Thread.sleep(time*10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(time+", ");
}
}
/* 排序 */
for (int i = 0; i < arr.length; i++) {
new Slee(arr[i]).start();
}
}
猴子排序(随机排序)
猴子排序引用了无限猴子定理:即一只猴子随机不停的敲击键盘,如果时间足够长,那么它总有可能会打出特定的文本,比如莎士比亚全集?,算法通过不停的随机排列数组,直到数组有序
/* 判断一个数列是否有序 */
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));
}
珠排序
我们知道,在重力的作用下,如果将算盘立起来,无论怎么拨动,算珠最终都会掉下来紧挨在一起,那如果每根柱子上的算珠个数不太一样呢?见图片

如图,我们看到神奇的重力已经帮我们排好序了?那如何将此现象写成代码呢?我们用一个二维数组模拟整个算盘,每一个数拥有一行算珠
见代码
/*
* 一串串珠子 如下 最上面的珠子会往下掉 变成下图
* ******** *
* **** | **
* ****** \|/ ****
* ** . ******
* * ********
* 用二位数组将数字模拟成珠子
*/
public void pearlSort(int[] arr) {
int min=arr[0];
int max=arr[0];
for (int i = 0; i < arr.length; i++) {
if(min>arr[i]) {
min=arr[i];
}
if(max<arr[i]) {
max=arr[i];
}
} /*
* 定义二维数组
*/
int[][] pal=new int[arr.length][max-min+1];
/*
* 给二维数组串上珠子
*/
for (int i = 0; i < pal.length; i++) {
for (int j = 0; j < arr[i]-min; j++) {
pal[i][j]=1;
}
pal[i][pal[i].length-1]=arr[i];
} /*
* 珠子往下落
*/
for (int i = 0; i < pal.length; i++) {
for (int v = pal.length-1-i; v > 0; v--) {
for (int j = 0; j < pal[v].length-1; j++) {
if(pal[v][j]!=0&&pal[v-1][j]==0) {
pal[v][j]=0;
pal[v][pal[v].length-1]--;
pal[v-1][j]=1;
pal[v-1][pal[v].length-1]++;
}
}
}
/*
* 依次将剩余的最大值赋给原数组
*/
arr[arr.length-1-i]=pal[i][pal[i].length-1];
}
}
面条排序
如果桌子上有一把长短不一的面条,此时你将面条立起来,下端平放在桌面上,此时你用手掌在空中从上往下缓慢移动,慢慢的,你的手掌触碰到了一根面条(这根面条是最高的),你将这根面条抽走(抽走的面条当然想怎么吃就怎么吃),手继续慢慢向下移动,这是,你又碰到了倒数第二高的面条,你又将其抽走,。。。。
算法中,我们用一个数模拟手,每次-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;
}
}
}
}
对于这些似乎玩笑性的排序算法,除了睡眠排序,我几乎没有找到相关源码,这些源码是我尝试着去写的,并为其做个小总结,也是为了能给一些人做个借鉴,当然如果有地方写的不好,或者有什么问题与意见,欢迎大家提出来
Java排序 - 不实用的几个排序算法 -- 睡眠排序、猴子排序、面条排序、珠排序的更多相关文章
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- Java常用排序算法+程序员必须掌握的8大排序算法
概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- java中list集合的内容,如何使用像数据库中group by形式那样排序
java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name mone ...
- Java实现 蓝桥杯 算法训练 第五次作业:字符串排序
试题 算法训练 第五次作业:字符串排序 问题描述 输入一个小写字符串,按从小到大的顺序输出. 输入格式 bcaed 输出格式 abcde 顶格输出,中间没有空格 样例输入 一个满足题目要求的输入范例. ...
- Hark的数据结构与算法练习之珠排序
---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦. 大家看一 ...
- 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较
我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...
- JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
随机推荐
- 背包问题(01背包,完全背包,多重背包(朴素算法&&二进制优化))
写在前面:我是一只蒟蒻~~~ 今天我们要讲讲动态规划中~~最最最最最~~~~简单~~的背包问题 1. 首先,我们先介绍一下 01背包 大家先看一下这道01背包的问题 题目 有m件物品和一个容量为 ...
- node-fs文件系统模块
在node环境中所有与文件操作都是通过fs核心模块实现的.包括文件的创建.删除.查询以及读写和写入 在 fs 模块中,所有的方法都分为同步和异步两种实现,具有 sync 后缀的方法为同步方法,不具有 ...
- 模拟stringBeanFactory解析xml
思路:根据源码分析,将配置Bean类信息存放到xml文件中,通过解析xml, 然后反射拿到对象 存放到集合中 这里选择hashmap(键放置类名,值放置对象)存放,使用时使用get方法通过键(类名)拿 ...
- Nodejs一键实现微信内打开网页url自动跳转外部浏览器访问的功能
前言 现如今微信对第三方推广链接的审核是越来越严格了,域名在微信中分享转发经常会被拦截,一旦被拦截用户就只能复制链接手动打开浏览器粘贴才能访问,要不然就是换个域名再推,周而复始.无论是哪一种情况都会面 ...
- 分享一个VueCli 3.0的项目模板
个人搭建的Vue项目模板 默认自带 Vuex Less 封装内容如下 vue.config axios 封装 vue 配置环境文件 vue 自定义路径映射 (cli3.0取消了默认@ 映射src的 ...
- 第一章Java学习(查漏补缺)
第一章主要内容: 1.Java的地位:网络地位 语言地位 需求地位 2.Java的特点:①简单 面向对象 平台无关:软件的运行不因操作系统,处理器的变化而无法运行或出现运行错误. ②多线程 动态 3. ...
- 集成方法 Bagging原理
1.Bagging方法思路 Bagging独立的.并行的生成多个基本分类器,然后通过投票方式决定分类的类别 Bagging使用了自助法确定每个基本分类器的训练数据集,初始样本集中63.2%的数据会被采 ...
- Linux环境 tp5.1 Could not open input file: think
服务器命令行执行:php /项目目录/think queue:listen 报如下错误 初步分析是 queue:listen 在代码中要重启一个work进程,用到了think ,导致找不到该文件的路 ...
- story 泄露服务器libc版本
记录下学到的姿势,利用信息泄露得到服务器libc 至少两个函数偏移,利用libc-databse得到服务器libc版本 传送门 泄露脚本如下 from pwn import * context.log ...
- LNMP安装目录及配置文件位置
LNMP相关软件安装目录 Nginx 目录: /usr/local/nginx/ MySQL 目录 : /usr/local/mysql/MySQL数据库所在目录:/usr/local/mysql/v ...