睡眠排序简介
睡眠排序算法是一种比较另类有趣的排序算法,其核心思想与CPU调度机制相关,是通过多线程让每一个数据元素睡眠一定规律的时间,睡眠时间要和自身数据大小存在一定的规律,睡眠时间短的先进行输出,睡眠长的后输出,从而实现数据有序输出。
睡眠排序由于其独有的排序方式,排序数字最好是非负整数,且最大值不要太大,否则算法会运行很久……非负小数其实也可以,但是排序后的相邻小数的差值不要太小,否则可能会出错,因为多线程的运行有其不确定性和延迟的可能……
睡眠排序涉及到多线程的设计、启动、运行,以及控制的方法,是多线程编程的一次小小实战!
睡眠排序实战
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/*
*@author Azheng
*@description
*@date 2022/4/9
*/
public class MoreThreadSleepSort {
//定义一个数组
static int[] nums={78,42,56,5,46,33,28,89,1,18};
//新建集合arraylist集合存放排序后的数据
static List<Integer> list = new ArrayList<>();
public static void main(String[] args) {
sleepSort(nums);
}
//多线程睡眠排序大法
/**
* @param nums
*/
public static void sleepSort(int[] nums){
//for循环遍历
int i = 0;
for (; i < nums.length; i++) {
final int num = nums[i];
//多线程睡眠操作 lamda表达式
new Thread(()->{
try {
Thread.sleep(num);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("每个线程的最终结果"+num);
list.add(num);
System.out.println(list);
}).start();
}
//显示最终排序结果
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//重新排序
System.out.println(list);
}
}
睡眠排序缺陷
(1) 搞不定负数。
(2) 输入数据很相近时会有误差
(3) 输入数据很多时,这些线程不能看作是同时启动
(4) 输入数据很大时,这些线程线程会睡死等等...
解决方式:
(1),可以用一个在恒正的函数把输入映射成时间;
(2),可以乘个系数,放大数据间的差,但是依然搞不定重复的数据;
(3),试着让算法在多个物理核上真正的并行起来
(4),数据不能过大