请设计一个算法,在有序顺序表L中插入元素x,使得表依然有序,并输出新增元素后的表数据。
例如:
L的元素 1 3 5 7
插入新元素 4
输出 1 3 4 5 7
其中,L的长度不超过1000,当中的元素为非递减排序。
输入格式:
第一行输入L的长度
第二行输入L的元素
第三行输入要插入的元素x的值
输出格式:
输入插入元素后顺序表中各元素的值,值之间用一个空格间隔。
输入样例:
4
1 3 5 7
4
输出样例:
1 3 4 5 7
代码
#include <stdio.h>
int main() {
int L[1001]; // 最大容量为1001
int n, x;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &L[i]);
}
scanf("%d", &x);
// 寻找插入位置
int pos = 0;
while (pos < n && L[pos] < x) {
pos++;
}
// 后移元素
for (int i = n; i > pos; i--) {
L[i] = L[i - 1];
}
L[pos] = x;
n++; // 更新表长
// 输出结果
for (int i = 0; i < n; i++) {
printf("%d ", L[i]);
}
return 0;
}
算法思路
- 输入处理:读取顺序表的长度、元素以及待插入元素。
- 寻找插入位置:通过遍历顺序表找到第一个大于或等于待插入元素的位置。
- 元素后移:将插入位置后的所有元素后移一位,为待插入元素腾出空间。
- 插入元素并更新表长:将元素插入到正确位置,并更新顺序表长度。
- 输出结果:遍历顺序表并输出所有元素。
复杂度分析
- 时间复杂度:O(n),最坏情况下需要遍历整个数组并移动所有元素。
- 空间复杂度:O(1),除了输入输出外,仅使用了常数级别的额外空间。
该算法确保在插入元素后,顺序表依然保持非递减顺序,适用于题目给定的约束条件。