一个三个算法。
//O(N*N*logN)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define Size 40
long RandInt(long i,long j)//give a random between i and j
{
if (0 == i ) {
return rand()%j;
}
else{
return rand()%(j-i+1)+i;
}
}
int IfDuplicate(long A[ ],long end,long rand )//return 0 means rand is duplicate
{
int i;
for (i = 0; i < end; i++)
{
if (rand == A[i] )
{
return 1;
}
}
return 0;
}
int main()
{
long i = 1,j,ran,k;
long A[Size];
srand(time(NULL));
A[0] = RandInt(1,Size);
while(i < Size){
ran = RandInt(1,Size);
if (!IfDuplicate(A, i ,ran)){//if there is no duplicate give random to a[i]
A[i] = ran;
i++;
}
}
k = 1;
while (k < Size+1)
{
printf("A[%ld] = %-4ld ",k,A[k-1]);
if(k%5 == 0){
printf("\n");
}
k++;
}
return 0;
}
//O(N*log(N))
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define Size 40
int RandInt(int i,int j)//give a random between i and j
{
if(i==0)
return rand()%j;
else
return rand()%(j-i+1)+i;
}
int main()
{
int i,ran,k;
int A[Size],used[Size+1]={0};
srand(time(0));
for(i=0;i<Size;i++)
{
ran=RandInt(1,Size);
while(used[ran]==1)
{
ran=RandInt(1,Size);
}
A[i]=ran;
used[ran]=1;
}
for(k=0;k<Size;k++)
{
printf("A[%d] = %d ",k,A[k]);
if(k%5==0)
{
printf("\n");
}
}
return 0;
}
//O(N)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define Size 5
long RandInt(long start,long end)//give a random between i and j
{
return start+(end-start)*rand()/(RAND_MAX + 1.0);
}
int main()
{
srand(time(NULL));
long i , j, k,ran;
long c;
long A[Size];
for(i = 0; i < Size; i++)
{
A[i]=i+1;
}
for(j = 1; j < Size; j++)
{
c=A[j];
ran=RandInt(0,j);
A[j]=A[ran];
A[ran]=c;
}
k = 1;
while (k < Size+1)
{
printf("A[%ld] = %-4ld ",k,A[k-1]);
if(k%5 == 0){
printf("\n");
}
k++;
}
return 0;
}
历时一天终于全部搞定了。。好不容易