1. 程式人生 > >洗牌演算法

洗牌演算法

換位置法

基本思路是:先初始化一串分佈的數字,然後為每個位置依次生成一個與之交換的隨機位置,如果生成的隨機位置不是它本身就執行交換操作。

實現程式碼:

void swap(int& a, int& b) 
{ 
    a = a^b; 
    b = a^b; 
    a = a^b; 
} 

size_t shuffle2(int s[], int n) 
{ 
    size_t t=0;//計算迴圈次數 
    for (int i=0; i<n; i++) 
    { 
        t++; 
        s[i] = i; 
    } 
    for
(int i=0; i<n; i++) { t++; int num = rand()%n; if (num != i) { swap(s[num],s[i]); } } return t; } void printCards2(int s[], int n) { for (int i=0; i<n; i++) { cout << s[i] << " "; } cout
<< endl; }

比較:在時間上快好多,因為交換位置的次數的最大值是限定了的(生成隨機數的次數是固定的),而且省去了查詢新生成數是否在已生成數中的時間。方法一中,當新生成的數在已生成的數中就需要從新生成一個隨機數,從而隨機生成數的次數是不固定的(有最小值)。