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

函数功能

在已排序的升序数组 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;

    }

相关推荐
寻星探路5 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
你撅嘴真丑7 小时前
第九章-数字三角形
算法
曹牧7 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
uesowys7 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder7 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮7 小时前
AI 视觉连载1:像素
算法
爬山算法8 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
智驱力人工智能8 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
kfyty7258 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai