C语言之random_n-续

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

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

具体的代码实现如下:

#include<stdio.h>
#include<stdlib.h>

#define MAX_NUM 10
void random_n(int a[],int n);

int main()
{
    int a[MAX_NUM],i=0,j=0;
    while(j<MAX_NUM)
    {
        a[j]=-1;
        j++;
    }
    random_n(a,MAX_NUM);
    while(i<MAX_NUM)
    {
        printf("%d\t",a[i]);
        i++;
    }
    printf("\n");
    return 0;
}

void random_n(int a[],int n)
{
    int  temp[n],k=0,count=0,x=0;
    while(k<n)
    {
        temp[k]=k;
        k++;
    }
    srand(time(0));
    count=n;
    k=0;
    while(count)
    {
       x=rand()%count;
       a[k]=temp[x];
       printf("X= %d\t temp= %d \n",x,a[k]);
       temp[x]=temp[count];
       count=count-1;
       k=k+1;
       x=0;
    }
}

调试和运行结果:


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

思考过程如下:

 ----------------------------------------------------------------------------------------------

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

-----------------------------------------------------------------------------------------------

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

----------------------------------------------------------------------------------------------

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

-----------------------------------------------------------------------------------------------

下一次的寻址范围是:

----------------------------------------------------------------------------------------------

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

-----------------------------------------------------------------------------------------------

依次覆盖。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值