1. 程式人生 > >如何將一個數組隨機打亂

如何將一個數組隨機打亂

題目是如何將一個數據隨機打亂:

方案一:

  1. 直觀能想到一種演算法是迴圈遍歷陣列,每一次產生一個隨機的小標數,將這個下標所在的位置移出去,然後將這個值存到另外一個新的數組裡,直到最後還有一個元素為止。這樣的隨機取出來的陣列成的陣列是隨機。
  2. 改演算法虛擬碼:
       int j=0;
       int size = a.size;
       for(i=0;i < size ;i++)
           index = rand() % size - 1;
           b[j++]=a[index];
           for(k=index;k < size
-1;k++) a[k]=a[k+1]; size--;

看出來方案一的時間複雜度是O(N^2) ,輔助空間N;

方案二:

  1. Fisher and Yates’ 提出了時間複雜度O(N),輔助空間1,的隨機打亂演算法具體演算法虛擬碼如下:
    for(i=n-1;i>=0;i--)
        index= rand(i+1)%i+1  //generate random index 0<=index<=i
        if(i != index)
            exchange(i,index)

參考資料