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

函数功能

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

    }

相关推荐
这个昵称不容易7 分钟前
旅游管理系统的设计与实现(SpringBoot + MySQL + Vue 前后端分离)
java·springboot·毕设
Rain的Java大神之路8 分钟前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode
NEFU_Jyj14 分钟前
贝尔数(组合数学)
算法
1-1=042 分钟前
C# 数据结构和特殊类型
数据结构·c#·.net·.netcore
希和20271 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Pniubi1 小时前
力扣73 矩阵置零
算法·leetcode·矩阵
天天被压力1 小时前
【A股分钟级高频数据完全手册 #11】券商实时行情数据接口:实时交易(券商源)接入与字段
java·人工智能·python
天天被压力1 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python
Wang's Blog10 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain11 小时前
C++转Java日记(03)
java·开发语言·c++