You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言:使用指针填充无重复整数数组的优化方案探讨

优化无重复随机整数数组填充的实现方案(指针版)

你的现有实现虽然能完成功能,但存在效率短板:当MAX_SIZE较大时,越到后期生成不重复随机数的概率越低,会频繁触发重复检查循环,整体时间复杂度为O(n²),数组规模越大性能下降越明显。

更高效的方案是采用Fisher-Yates洗牌算法,它能在**O(n)**时间复杂度内生成无重复的随机排列,且完全可以用纯指针操作实现,符合作业要求。

优化后的代码实现

#include <stdlib.h>
#include <time.h>

// 假设MAX_SIZE为已定义的常量宏,例如#define MAX_SIZE 4

void fillingArray(int *arr) {
    // 第一步:用指针初始化数组为0到MAX_SIZE-1的有序序列
    int *current = arr;
    for (int val = 0; val < MAX_SIZE; ++val) {
        *current = val;
        current++;
    }

    // 第二步:Fisher-Yates洗牌,纯指针操作交换元素
    current = arr + MAX_SIZE - 1; // 指向数组最后一个元素
    while (current > arr) {
        // 计算当前元素与起始元素的偏移量,生成随机交换位置
        int offset = current - arr;
        int randomOffset = rand() % (offset + 1); // 生成0到offset范围内的随机数
        int *swapPtr = arr + randomOffset;

        // 交换两个指针指向的元素值
        int temp = *current;
        *current = *swapPtr;
        *swapPtr = temp;

        current--;
    }
}

// 注意:使用前需在程序入口处调用srand(time(NULL))初始化随机数种子,避免每次生成相同序列

方案核心优势

  1. 性能大幅提升:从原实现的O(n²)优化到O(n),数组规模越大,性能差距越显著
  2. 逻辑更简洁:无需反复生成随机数并遍历检查重复,避免无效循环
  3. 纯指针操作:全程用指针完成遍历、赋值、交换,完全满足“不用数组下标”的要求

内容的提问来源于stack exchange,提问作者Ricardo Roel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:35:07