摘要###(1)创建一个随机数组A[N],其元素分布为1到N-1,且不能重复.
(2)有几种算法:
{1}用一个附加数组used[N],每生生成一个A[i],令used[i] = 1;在余下的计算中,每次都测试 if used[i] == 1,以避免重复.
{2}直接生成1-N-1,然后随机交换A[i],A[k],k通过i随机生成。
(3)分析算法:对应{1},算法1花费的时间界为
∑i=0(1/Pi)
,其中Pi = i/1(成功的概率),O(N^2)量级.
算法2进行了O(N)次,效率明显高.
#include "stdafx.h"
#include "stdlib.h"
#include "time.h"
#define N 500000
void swap(int *A,int *B)
{
int temp;
temp = *B;
*B = *A;
*A = temp;
}
int _tmain(int argc, _TCHAR* argv[])
{
clock_t start,finish;
int A[N] = {0};
start = clock();
for (int i = 0;i<= N-1;i++)
A[i] = i+1;
for (int i = 0;i<=N-1;i++)
{
srand((int)time(0));
int k = (rand())%(i+1);
swap(&A[i],&A[k]);
}
finish = clock();
printf("The process use %f seconds", (double)(finish - start)/CLOCKS_PER_SEC);
system("pause");
return 0;
}
“`