ckook

导航

 

问题:一副扑克牌不含大小王共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);
}
posted on 2012-05-29 21:09  ckook  阅读(486)  评论(0)    收藏  举报