很多算法问题在它们的解决方案中都和排序有关。例如,可以根据随机键值“排序”,以打乱一个数组。一种方法就是使用选择排序算法,然后把找到最小值的位置改成选择一个随机位置。该结果是一个打乱算法,其中各种可能的输出是等概率的。
编写一个程序,通过随机排序输出1-52之间的整数。
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
//#define min(x,y) ((x)>(y)?(y):(x))
int* Chaos(int* array, int n);
int main(void)
{
int* p;
int i;
int num[53];
//用系统时间初始化随机数的生成种子,这样每次运行程序随机数都不一样
srand((unsigned)time(NULL));
for (i = 0; i <= 51; i++) {
num[i] = i + 1;
}
p = Chaos(num, 52);
for (i = 0; i <= 51; i++) {
printf("%d ", *(p++));
}
return 0;
}
int* Chaos(int* array, int n)
{
int array2[52];
int* p = array;
int cnt = n, i, j, minnum, randomnum;
for (i = 0; i <= 51; i++) {
array2[i] = array[i];
array[i] = -1;
}
for (j = 1; j <= 52; j++) {
minnum = 55;
for (i = 0; i <= 51; i++) {
if (minnum > array2[i]) {
minnum = array2[i];
array2[i] = 55;
}
}
do {
randomnum = rand()%52; //一种生成一定范围随机数的操作
} while (array[randomnum] != -1);
array[randomnum] = minnum;
}
return array;
}