首页 技术 正文
技术 2022年11月23日
0 收藏 496 点赞 4,006 浏览 2497 个字

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

睡眠排序

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

珠排序

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

Java排序 – 不实用的几个排序算法 — 睡眠排序、猴子排序、面条排序、珠排序

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

见代码

     /*
* 一串串珠子 如下 最上面的珠子会往下掉 变成下图
* ******** *
* **** | **
* ****** \|/ ****
* ** . ******
* * ********
* 用二位数组将数字模拟成珠子
*/
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;
}
}
}
}

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,992
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,506
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,349
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,134
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,767
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,844