前N个自然数的随机置换

来源:互联网 发布:知乎 古龙经典片段 编辑:程序博客网 时间:2024/05/14 09:18

一个三个算法。

//O(N*N*logN) #include <stdio.h>#include <stdlib.h>#include <time.h> #define Size 40long 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 40int 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 5long 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;}

历时一天终于全部搞定了。。好不容易

0 0
原创粉丝点击