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

函数功能

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

    }

相关推荐
二十雨辰6 分钟前
[Java]-场景题
java·开发语言
MZA66610 分钟前
Spring Boot 实战:基于自定义注解 + AOP 实现 Kafka 消息无侵入异步上送
java·spring boot·kafka
我是大猴子11 分钟前
为什么SSE无法代替Webscoket
java
重庆小透明16 分钟前
Kafka 完全指南:从基础组件到核心原理(包含面试题)
java·分布式·微服务·架构·kafka
CodeStats27 分钟前
【Java文件IO】Java 文件 IO 体系深度拆解(中):NIO API 详解、Files 与 FileChannel 巅峰对决
java·io·文件·nio·零拷贝·mmap
geovindu31 分钟前
java:Observer Pattern
java·开发语言·后端·观察者模式·设计模式·行为模式
LuminousCPP32 分钟前
数据结构 - 排序(二):快速排序从错误初版到优化版|双指针划分 + 三数取中 + 小区间插入优化
c语言·数据结构·笔记·算法·排序算法
lemon_sjdk36 分钟前
ObservableNumberValue接口
java·javafx
wxwx_bscxy32242 分钟前
springboot巡更系统10192
java·spring boot·后端·巡更系统
hansang_IR42 分钟前
【题解】P9753 [CSP-S 2023] 消消乐
数据结构·c++·算法