集合篇12:算法篇

12:算法篇

  • 1.洗牌算法

1.洗牌算法

方法一:2n张牌,分成两堆,右手最后一张放;左手最后一张放,右手倒数第二张放,左手倒数第二张放

#include
using namespace std;
void xipai(vector<int> &nums)
{
     
    vector<int> temp=nums;
    int n=nums.size()/2;
    for(int i=0;i<n;i++)
    {
     
        nums[2*i]=temp[i];
        nums[2*i+1]=temp[i+n];
    }
}
int main()
{
     
    int n;
    cin>>n;
    vector<int> nums(2*n);
    for(int i=0;i<2*n;++i)
    {
     
        cin>>nums[i];
    }
    xipai(nums);
    for(int i=0;i<nums.size();++i)
        cout<<nums[i]<<" ";
    cout<<endl;
    return 0;
}

方法二:使用函数 srand(time(0)) 和rand()%n;
rand函数底层:伪随机,约定,a1=f(num), a(n+1)=f(an);

#include
using namespace std;
int main()
{
     
    int n;
    cin>>n;
    vector<int> nums(n);
    for(int i=0;i<n;++i)
    {
     
        cin>>nums[i];
    }
    srand(time(0)); //拿当前系统时间作为种子,由于时间是一直变化的,种子也是变换的
    vector<int>::iterator ite;
    while(n>0)
    {
     
        int r=rand()%n;
        cout<<nums[r]<<" ";
        ite=find(nums.begin(),nums.end(),nums[r]);
        nums.erase(ite);
        n--;
    }
    cout<<endl;
    return 0;
}

你可能感兴趣的:(编程集合篇)