# 洗牌算法
这个代码很简单,只有两行代码,但是却可以实现这个功能:对于给定的 n 个元素,生成的那个排列,每一个元素都能等概率地出现在每一个位置。
换句话说,每一个位置都能等概率地放置每个元素。
代码如下(JDK 中 Collections.shuffle () 也是这样实现的):
for(int i = n - 1; i >= 0 ; i -- ) | |
// rand(0, i) 生成 [0, i] 之间的随机整数 | |
swap(arr[i], arr[rand(0, i)]) |
# 睡眠排序
代码如下:
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 个数一一对应。
初始化后,线程们开始睡眠,等到对应的数那么多个时间单位后各自醒来,然后输出它对应的数。
这样最小的数对应的线程最早醒来,这个数最早被输出。
等所有线程都醒来,排序就结束了。
不要问时间复杂度,时间复杂度在这个排序上已经毫无意义!