问题:一副扑克牌不含大小王共52张牌,现要求对一副扑克牌进行随机洗牌,时间复杂度O(n)。
解答:该问题本质上就是由原排列产生一个随机排列(可以不是全排列)。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 52
#define swap(a, b) int tmp = (a); (a) = (b); (b) = tmp
/*Inplace洗牌算法*/
void shuffle(int arr[], int len)
{
srand((unsigned int)time(NULL));
/*在n个元素中随机的取一个,并与n个元素中最后一个交换,缩小n的规模再重复以上过程*/
for(int n = len; n > 0; n--) {
int r = rand() % n;
swap(arr[r], arr[n-1]);
}
}
/*输出*/
void dump(int arr[], int len)
{
for(int i=0; i<len; i++)
printf("%d,", arr[i]);
printf("\n");
}
int main()
{
int A[N];
/*初始化扑克*/
for(int i=0; i<N; i++)
A[i] = i;
shuffle(A, N);
dump(A, N);
}
浙公网安备 33010602011771号