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

C++数组排序异常:生成10个随机数后末尾元素重复且缺失元素

解决C++数组排序后重复/缺失数字的问题

Hey there! 作为从Basic转C++的新手,碰到数组操作的小坑太正常啦~你说的排序后最后一个数字重复、还有数字缺失的问题,大概率是数组索引边界错误或者排序算法的循环逻辑漏洞,我来帮你拆解常见的几个原因:

1. 先排查随机数生成的问题

首先确认你有没有正确初始化随机种子:

  • 如果没加srand(time(nullptr)),每次程序运行生成的随机数序列是固定的,甚至可能出现重复值,但更关键的是:
  • 检查生成随机数的循环次数!比如如果写成for (int i=0; i<=10; i++),会生成11个数字,超出数组的10个元素容量,导致最后一个元素被覆盖,这就会出现“重复+缺失”的诡异现象。

正确的生成逻辑应该是:

int nums[10];
srand(time(nullptr)); // 必须加,确保每次随机数不同
for (int i = 0; i < 10; i++) { // 从0到9,刚好10个元素
    nums[i] = rand() % 100 + 1; // 生成1-100的随机数
}

2. 排序算法的边界错误是重灾区

从Basic转过来很容易在循环边界上踩坑(毕竟C++数组是0索引,和部分Basic的1索引逻辑不同),比如自己写冒泡/选择排序时,循环终止条件写错:

举个错误的冒泡排序例子(这就是你可能遇到的问题):

// 错误写法:外层循环跑了10次,内层循环没限制范围
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        if (nums[j] > nums[j+1]) {
            swap(nums[j], nums[j+1]);
        }
    }
}

这个写法里,内层循环j<10会导致j+1等于10,超出数组的最大索引9,访问了数组外的内存,把随机值带进来覆盖了最后一个元素,同时重复移动最后一个元素,就会出现重复+缺失。

正确的冒泡排序写法

for (int i = 0; i < 9; i++) { // 只需要排9轮,最后一个元素自动到位
    for (int j = 0; j < 9 - i; j++) { // 每轮少比较i个已排好的末尾元素
        if (nums[j] > nums[j+1]) {
            int temp = nums[j];
            nums[j] = nums[j+1];
            nums[j+1] = temp;
        }
    }
}

偷懒又靠谱的方法:用标准库排序

如果你不想自己写排序算法踩坑,直接用C++标准库的sort函数,它的边界处理是绝对正确的:

#include <algorithm> // 必须包含这个头文件

sort(nums, nums + 10); // 对nums[0]到nums[9]的元素排序

最后再提醒一个细节

C++数组的索引是从0开始的,这和你熟悉的Basic可能不一样,所以所有遍历数组的循环,都要确保是i从0到9(共10次循环),而不是1到10,一旦越界访问数组,就会出现各种莫名其妙的错误(比如重复、缺失、程序崩溃)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:23:33