0
点赞
收藏
分享

微信扫一扫

【每日一练---睡眠排序】

秦瑟读书 2022-04-13 阅读 48

睡眠排序简介 

睡眠排序算法是一种比较另类有趣的排序算法,其核心思想与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),数据不能过大

举报

相关推荐

0 条评论