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

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

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

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

原文地址:https://www.cnblogs.com/voidsky/p/5373922.html