洗牌算法

换位置法

基本思路是:先初始化一串分布的数字,然后为每个位置依次生成一个与之交换的随机位置,如果生成的随机位置不是它本身就执行交换操作。

实现代码:

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

比较:在时间上快好多,因为交换位置的次数的最大值是限定了的(生成随机数的次数是固定的),而且省去了查找新生成数是否在已生成数中的时间。方法一中,当新生成的数在已生成的数中就需要从新生成一个随机数,从而随机生成数的次数是不固定的(有最小值)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值