


函数功能
在已排序的升序数组 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];
}
这个循环同时完成两个任务:
-
查找插入位置 :从后往前找到第一个不大于
x的元素 -
移动元素 :在查找过程中,将大于
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;}