C语言之random_n

作者: 金沙澳门官网  发布:2019-11-15

 

之前写拉一个random_n的算法实现,虽然简单易懂,但是算法的效率相对来说不算很高,节省拉空间,只用到拉一个数组实现。

之前写算法排序时有些数据总是手工输入,多少有些不方便,而且在小数据量输入时还可以接受,但是当数据量上升到K级后就显得庞杂。而且要保证之前输入的数据没有太多重复或者不重复这就更是考验我们的记忆力拉。所有我写拉一个产生N个无序整数的程序,此程序可以产生N个数,且在0-N 之间,并且各不相同。

 

 

这个random_n的实现用到拉两个数组,子函数中的数组在函数栈销毁时释放空间。最好和最坏运行时间都是O(N )。主要时利用拉空间换时间。

具体代码如下:

 

 

具体的代码实现如下:

#include<stdio.h>

 

#include<stdlib.h>

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

 

 

#define MAX_NUM 10   //所要产生的数据量

#define MAX_NUM 10

 

void random_n(int a[],int n);

void  random_n(int a[],int n); 声明random_n函数

 

 

int main()

int main()

{

{

    int a[MAX_NUM],i=0,j=0;

    int a[MAX_NUM],i=0,j=0;

    while(j<MAX_NUM)

    while(j<MAX_NUM)

    {

    {

        a[j]=-1;

        a[j]=-1;          //初始化,很重要,之前在初始化上栽了大跟头

        j++;

        j++;

    }

    }

    random_n(a,MAX_NUM);

    random_n(a,MAX_NUM);

    while(i<MAX_NUM)

    while(i<MAX_NUM)

    {

    {

        printf("%dt",a[i]);

        printf("%dt",a[i]);

        i++;

        i++;

    }

    }

    printf("n");

    printf("n");

    return 0;

    return 0;

}

}

 

void  random_n(int a[],int n)

void random_n(int a[],int n)

{

{

    int temp=0,j=0,count=0,i=0;

    int  temp[n],k=0,count=0,x=0;

    srand(time(0));

    while(k<n)

    while(count < n)

    {

    {

        temp[k]=k;

        printf("nStart!n");

        k++;

        temp=rand()%n;

    }

        printf("ncount = %d ,temp =%d",count,temp);

    srand(time(0));

        for(j=0;j<count;j++)

    count=n;

        {

    k=0;

            if(a[j]==temp)

    while(count)

            {

    {

              printf(" Find!n"); 

       x=rand()%count;

              i=1;

       a[k]=temp[x];

              break;

       printf("X= %dt temp= %d n",x,a[k]);

            }

       temp[x]=temp[count];

            else

       count=count-1;

            {

       k=k+1;

              i=0;   //做标记

       x=0;

            }

    }

        }

}

        if(j==count && i==0) //比较完毕并且没有找到相同的

 

        {

调试和运行结果:

              printf("nNOT  Find !n");

 图片 1

              a[count]=temp;

 

              count++;

主要的思想:先产生0-N 之间的所有数,然后依次产生一个随机数,把产生的随机数当做下标,访问已经产生的有序数组,并取出下表所对应的值付给我们传进来的元数组。然后把这个数用最后一个数据覆盖掉。然后让产生随机数的模减1,这样下次访问的有效范围便是之前没有访问过的。这样依次循环进行知道数组填满。

        }

 

    }

思考过程如下:

 

 

}



 

|      0    |    1        |         2    |    .。。。  |       。。。    |     N-1       |            N      |


 

假如产生的随机数为2,则:

 


 

|      0    |    1        |         N    |    .。。。  |       。。。    |     N-1       |            N      |


 

下一次的寻址范围是:

 


 

|      0    |    1        |         2    |    .。。。  |       。。。    |     N-1       |            N      |


 

依次覆盖。

摘自 明月天涯

这个random_n的...

运行结果:

 

图片 2添加这个小函数后,我们在之后的算法数据输入时可以直接调用这个函数,事先声明一个含有MAX_NUM 个元素的数组,然后传参给random_n函数即可。算法的最坏运行情况为O (N^2),最好运行情况为O (N)。

 

 

这个算法效率不算高,之后我会给大家介绍一个效率更高的生成无序数的方法

摘自 明月天涯

...

本文由金沙澳门官网送注册58发布于金沙澳门官网,转载请注明出处:C语言之random_n

关键词:

上一篇:敌兵布阵
下一篇:没有了