如何用两个数组在C++中向有序数组插入新值并保持升序
问题分析与修复代码
你的现有代码逻辑完全混乱,核心问题包括:
- 赋值方向搞反:应该是把原数组/新元素写入目标数组,而非反过来修改原数组
- 循环提前终止:else分支直接return,导致第一次遇到不满足条件就停止,根本没完成数组构建
- 越界访问:循环条件
i <= source_len会访问原数组的source[source_len],这是超出数组范围的非法内存 - offset变量未正确使用:没有起到插入元素后偏移后续元素的作用
下面是符合要求的正确实现(函数本身无需额外库,调用时仅用到<iostream>和<iomanip>):
int insert_into_sorted(int source[], int source_len, int destination[], int new_elem) { int i = 0; // 复制原数组中所有小于等于新元素的部分 while (i < source_len && source[i] <= new_elem) { destination[i] = source[i]; i++; } // 插入新元素到目标数组的对应位置 destination[i] = new_elem; // 复制原数组剩余的元素(往后偏移一位) for (int j = i; j < source_len; j++) { destination[j + 1] = source[j]; } // 返回目标数组的长度(原长度+1) return source_len + 1; }
代码逻辑解释
- 前置复制:用while循环遍历原数组,把所有比新元素小或相等的元素直接复制到目标数组对应位置,直到找到第一个比新元素大的元素,或遍历完原数组。
- 插入新元素:此时
i的位置就是新元素应插入的索引,直接赋值给目标数组。 - 后置复制:把原数组中剩下的元素(从
i开始)复制到目标数组的i+1及以后位置,实现元素后移。 - 返回长度:目标数组长度是原数组长度加1,调用者可通过这个值遍历输出目标数组。
测试用例验证
针对原数组[10,20]插入15的场景:
- 前置复制:i=0时,10<=15,复制到destination[0];i=1时,20>15,退出循环。
- 插入15到destination[1]。
- 后置复制:把source[1]的20复制到destination[2]。
- 最终目标数组为
[10,15,20],符合升序要求。
内容的提问来源于stack exchange,提问作者OhAlexNo
相关产品推荐
相关产品推荐

