洗牌算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洗牌算法相关的知识,希望对你有一定的参考价值。

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

以上是关于洗牌算法的主要内容,如果未能解决你的问题,请参考以下文章

洗牌算法

VB洗牌算法产生随机数组

扑克牌的完美洗牌算法

随机洗牌算法Knuth Shuffle和错排公式

常用算法篇-洗牌算法

程序员的算法趣题Q50: 完美洗牌