洗牌算法
http://blog.chinaunix.net/uid-20775243-id-2555001.html
下面是一个完全随机的洗牌算法,时间复杂度为O(n)。
/*
* Description:
* 洗牌算法
* Author :FinL
* Language: C
* Date : 2010-10-08
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void swap(int &a,int &b)
{
assert(a!=b);
a ^=b;
b ^=a;
a ^=b;
}
void display(int card[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",card[i]);
printf("\n");
}
/*算法主程序*/
void Shuffle(int card[],int n)
{
int i;
int index=0;
for(i=0;i<n;i++)
{
/*返回i到n之间的一个数字*/
index=rand()%(n-i)+i;
swap(card[i],card[index]);
}
}
int main()
{
int card1[54],card2[54];
int i;
for(i=0;i<54;i++)
{
card1[i]=i;
card2[i]=i;
}
srand((unsigned)time(NULL));
Shuffle(card1,54);
Shuffle(card2,54);
printf("Wash.......\n");
display(card1,54);
display(card2,54);
return 0;
}