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
相关产品推荐
相关产品推荐

