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

函数功能

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

    }

相关推荐
im_AMBER19 分钟前
Leetcode 59 二分搜索
数据结构·笔记·学习·算法·leetcode
专注于大数据技术栈20 分钟前
java学习--final
java·开发语言·学习
gihigo199826 分钟前
基于MATLAB的IEEE 14节点系统牛顿-拉夫逊潮流算法实现
开发语言·算法·matlab
万物挽挽1 小时前
数据结构核心
数据结构
天殇凉1 小时前
AC自动机学习笔记
java·笔记·学习
TechTrek1 小时前
Spring Boot 4.0正式发布了
java·spring boot·后端·spring boot 4.0
甄心爱学习1 小时前
数据挖掘-聚类方法
人工智能·算法·机器学习
飞梦工作室2 小时前
企业级 Spring Boot 邮件系统开发指南:从基础到高可用架构设计
java·spring boot·后端
haiyu柠檬2 小时前
在Spring Boot中实现Azure的SSO+VUE3前端配置
java·spring boot·后端