
《Algorithms算法》笔记:元素排序(3)——洗牌算法
洗牌算法
洗牌的思想很简单,就是像洗扑克牌一样,对一组数据进行随机打乱,这个算法在很多应用里都非常有用,特别是对于后面需要介绍的快排来说,这个算法直接影响了快排的效率。
洗牌的算法这里提了2种
排序洗牌
- 思想很简单,先对每个元素生成一个随机数,然后对这些随机数进行排序
排序前
排序后
Knuth洗牌
- 一个更简单的算法,不用sort,每次产生一个[0,i]的随机数r,然后交换a[i]和a[r],这个是个线性时间算法。
Knuth洗牌代码
public class StdRandom
{
...
public static void shuffle(Object[] a)
{
int N = a.length;
for (int i = 0; i < N; i++)
{
int r = StdRandom.uniform(i + 1); //<<--[0,i]
exch(a, i, r);
}
}
}
注:洗牌的最佳算法是用硬件随机数生成器
基本观点:洗一副牌是复杂的