洗牌演算法
阿新 • • 發佈:2019-01-08
換位置法
基本思路是:先初始化一串分佈的數字,然後為每個位置依次生成一個與之交換的隨機位置,如果生成的隨機位置不是它本身就執行交換操作。
實現程式碼:
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;
}
比較:在時間上快好多,因為交換位置的次數的最大值是限定了的(生成隨機數的次數是固定的),而且省去了查詢新生成數是否在已生成數中的時間。方法一中,當新生成的數在已生成的數中就需要從新生成一個隨機數,從而隨機生成數的次數是不固定的(有最小值)。