有n(n<=100)个整数,已经按照从大到小顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。
输入格式:
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。
输出格式:
对于每个测试实例,输出插入新的元素后的数列。
输入样例:
3 3
4 2 1
0 0
输出样例:
在这里给出相应的输出。例如:
4 3 2 1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
-
在
main
函数中,输入的n
和m
,如果n
和m
都为0,则表示输入数据的结束,程序结束运行。否则,输入已经有序的n
个数,并调用insert
函数将m
插入数列。 -
定义一个
insert
函数,用于将数m
插入有序数组a
中,并输出新的序列。 -
在
insert
函数中,首先寻找插入位置i
,找到第一个大于m
的元素位置。 -
然后,将插入位置后的元素往后移动一位,给
m
腾出位置。 -
在插入位置
i
处插入m
。 -
最后,遍历整个数组,输出新的序列。
代码
#include<stdio.h>
void insert(int a[], int n, int m) {
int i, j;
// 寻找插入位置
for(i = 0; i < n; i++) {
if(m > a[i])
break;
}
// 将插入位置后的元素往后移动一位
for(j = n - 1; j >= i; j--) {
a[j + 1] = a[j];
}
// 在插入位置插入新元素
a[i] = m;
// 输出新的序列
for(i = 0; i <= n; i++) {
if(i == n)
printf("%d", a[i]);
else
printf("%d ", a[i]);
}
}
int main() {
int i, n, m;
while(scanf("%d%d", &n, &m) != EOF) {
// 判断m和n是否同时为0,如果是结束程序
if(n == 0 && m == 0)
break;
int a[100];
// 输入已有序列
for(i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
// 调用插入函数
insert(a, n, m);
}
return 0;
}