如何將一個數組隨機打亂
阿新 • • 發佈:2018-12-31
題目是如何將一個數據隨機打亂:
方案一:
- 直觀能想到一種演算法是迴圈遍歷陣列,每一次產生一個隨機的小標數,將這個下標所在的位置移出去,然後將這個值存到另外一個新的數組裡,直到最後還有一個元素為止。這樣的隨機取出來的陣列成的陣列是隨機。
- 改演算法虛擬碼:
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;
方案二:
- 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)