算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)

洗牌算法

这个代码很简单,只有两行代码,但是却可以实现这个功能:对于给定的 n 个元素,生成的那个排列,每一个元素都能等概率地出现在每一个位置。

换句话说,每一个位置都能等概率地放置每个元素。

代码如下:
for(int i = n - 1; i >= 0 ; i – )
swap(arr[i], arr[rand(0, i)]) // rand(0, i) 生成 [0, i] 之间的随机整数
算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)_第1张图片
算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)_第2张图片
算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)_第3张图片
算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)_第4张图片
算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)_第5张图片
算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)_第6张图片
算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)_第7张图片
算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)_第8张图片
算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序)_第9张图片

睡眠排序

public class SleepSort {  
    public static void main(String[] args) {  
        int[] ints = {1,4,7,3,8,9,2,6,5};  
        SortThread[] sortThreads = new SortThread[ints.length];  
        for (int i = 0; i < sortThreads.length; i++) {  
            sortThreads[i] = new SortThread(ints[i]);  
        }  
        for (int i = 0; i < sortThreads.length; i++) {  
            sortThreads[i].start();  
        }  
    }  
}  
class SortThread extends Thread{  
    int ms = 0;  
    public SortThread(int ms){  
        this.ms = ms;  
    }  
    public void run(){  
        try {  
            sleep(ms*10+10);  
        } catch (InterruptedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        System.out.println(ms);  
    }  
}  

它原理是构造 n 个线程,它们和这 n 个数一一对应。

初始化后,线程们开始睡眠,等到对应的数那么多个时间单位后各自醒来,然后输出它对应的数。

这样最小的数对应的线程最早醒来,这个数最早被输出。

等所有线程都醒来,排序就结束了。

不要问时间复杂度,时间复杂度在这个排序上已经毫无意义!

你可能感兴趣的:(算法:代码量很少,但很牛逼很经典的算法(洗牌算法、睡眠排序))