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

如何用两个数组在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;
}

代码逻辑解释

  1. 前置复制:用while循环遍历原数组,把所有比新元素小或相等的元素直接复制到目标数组对应位置,直到找到第一个比新元素大的元素,或遍历完原数组。
  2. 插入新元素:此时i的位置就是新元素应插入的索引,直接赋值给目标数组。
  3. 后置复制:把原数组中剩下的元素(从i开始)复制到目标数组的i+1及以后位置,实现元素后移。
  4. 返回长度:目标数组长度是原数组长度加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:10:45