洗牌算法

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;
}
posted @ 2016-02-18 11:31  fastwave2004  阅读(220)  评论(0编辑  收藏  举报