《Algorithms算法》笔记:元素排序(3)——洗牌算法

时间:2023-03-09 15:28:45
《Algorithms算法》笔记:元素排序(3)——洗牌算法

《Algorithms算法》笔记:元素排序(3)——洗牌算法


洗牌算法

洗牌的思想很简单,就是像洗扑克牌一样,对一组数据进行随机打乱,这个算法在很多应用里都非常有用,特别是对于后面需要介绍的快排来说,这个算法直接影响了快排的效率。

洗牌的算法这里提了2种

排序洗牌

  • 思想很简单,先对每个元素生成一个随机数,然后对这些随机数进行排序

排序前

《Algorithms算法》笔记:元素排序(3)——洗牌算法
排序后

《Algorithms算法》笔记:元素排序(3)——洗牌算法

Knuth洗牌

  • 一个更简单的算法,不用sort,每次产生一个[0,i]的随机数r,然后交换a[i]和a[r],这个是个线性时间算法。

《Algorithms算法》笔记:元素排序(3)——洗牌算法

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);
}
}
}

注:洗牌的最佳算法是用硬件随机数生成器

基本观点:洗一副牌是复杂的