数组----插入一个数到有序数列中

函数功能

在已排序的升序数组 a 中,插入一个新元素 x,并保持数组仍然有序

参数说明

  • int a[]:已排序的升序数组

  • int n:数组当前已有的元素个数

  • int x:要插入的新元素

代码逐步解释

第一步:找到插入位置

c

复制代码
p = 0;
while(x > a[p] && p < n)
    p++;
  • 从数组开头开始遍历

  • x 大于当前元素 a[p] 且没有越界时,继续向后移动

  • 循环结束时,p 就是新元素 x 应该插入的位置

示例 :在 [2, 5, 8, 10] 中插入 6

text

复制代码
比较 6 > 2 → p=1
比较 6 > 5 → p=2  
比较 6 > 8? 否 → 停止
最终 p=2(6应该插入在8前面)

第二步:腾出插入位置

c

复制代码
for(int i = n; i > p; i--)
    a[i] = a[i - 1];
  • 从数组末尾开始,将元素向后移动一位

  • 为新的元素腾出位置 p

继续示例

text

复制代码
初始: [2, 5, 8, 10, ?] (n=4)
移动: a[4] = a[3] → [2, 5, 8, 10, 10]
移动: a[3] = a[2] → [2, 5, 8, 8, 10]
现在位置p=2空出来了

第三步:插入新元素

c

复制代码
a[p] = x;
  • 将新元素 x 放入腾出的位置

完成示例

text

复制代码
a[2] = 6 → [2, 5, 6, 8, 10]
插入完成!
复制代码
#include <stdio.h>

#define N 100

void Insert(int a[], int n, int x);

int main()
{
    int a[N], n, x;

    printf("Please enter total number : \n");
    scanf("%d", &n);

    printf("Input the sorted array : \n");
    for(int i = 0; i < n; i ++ )
        scanf("%d", &a[i]);

    printf("Input x for insertion:\n");
    scanf("%d", &x);

    Insert(a, n, x);

    printf("The new array :\n");
    for(int i = 0; i <= n; i ++ )
        printf("%d, ", a[i]);

    return 0;
}
void Insert(int a[], int n, int x)
{
    int p;

    p = 0;
    while(x > a[p] && p < n)
        p++;

    for(int i = n; i > p; i--)
        a[i] = a[i - 1];

    a[p] = x;
}

在有序数组中插入新元素 的功能,但采用了更简洁的反向查找和移动的方法。

函数功能

在已排序的升序数组 a 中,插入一个新元素 x,并保持数组仍然有序

参数说明

  • int a[]:已排序的升序数组

  • int n:数组当前已有的元素个数

  • int x:要插入的新元素

代码逐步解释

核心逻辑:一边查找一边移动

c

复制代码
for (i = n - 1; i >= 0 && x < a[i]; i--)
{
    a[i + 1] = a[i];
}

这个循环同时完成两个任务:

  1. 查找插入位置 :从后往前找到第一个不大于 x 的元素

  2. 移动元素 :在查找过程中,将大于 x 的元素向后移动

执行过程详解

示例 :在 [2, 5, 8, 10] 中插入 6(n=4)

text

复制代码
初始状态: [2, 5, 8, 10, ?]
i = 3: 比较 x(6) < a[3](10)? 是 → a[4] = a[3] → [2, 5, 8, 10, 10]
i = 2: 比较 x(6) < a[2](8)? 是 → a[3] = a[2] → [2, 5, 8, 8, 10]  
i = 1: 比较 x(6) < a[1](5)? 否 → 循环结束

插入新元素

c

复制代码
a[i + 1] = x;

循环结束后:

  • i = 1(最后一个比较的位置)

  • a[i + 1] = a[2] 就是腾出的位置

  • 插入 x=6[2, 5, 6, 8, 10]

    #include <stdio.h>

    #define N 100

    void Insert(int a[], int n, int x);

    int main()
    {
    int a[N], n, x;

    复制代码
      printf("Please enter total number : \n");
      scanf("%d", &n);
    
      printf("Input the sorted array : \n");
      for(int i = 0; i < n; i ++ )
          scanf("%d", &a[i]);
    
      printf("Input x for insertion:\n");
      scanf("%d", &x);
    
      Insert(a, n, x);
    
      printf("The new array :\n");
      for(int i = 0; i <= n; i ++ )
          printf("%d, ", a[i]);
    
      return 0;

    }
    void Insert(int a[], int n, int x)
    {
    int i;

    复制代码
      for (i = n - 1; i >= 0 && x < a[i]; i--)
       {
          a[i + 1] = a[i];
       }
    
       a[i + 1] = x;

    }

相关推荐
Yzzz-F14 分钟前
Problem - 2205D - Codeforces
算法
极客先躯37 分钟前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户606487671889641 分钟前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java
我命由我123451 小时前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime
aXin_ya1 小时前
微服务第八天 Sentinel 四种分布式事务模式
java·数据库·微服务
智者知已应修善业1 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn1 小时前
Java Set集合相关知识点
java·开发语言·算法
Linsk1 小时前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
许彰午1 小时前
我手写了一个 Java 内存数据库(二):B+ 树的插入与分裂
java·开发语言·面试
zhouwy1131 小时前
Java 快速入门笔记:从基础语法到 Spring Boot 实战
java