题目:
已知数组a中的元素已按由小到大顺序排列,将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列。
例如:
数组: a[11] = {1,5,10,22,33,47,55,59,63,67};
插入的数为:13
插入后的数组:a[11] = {1,5,10,13,22,33,47,55,59,63,67};
解题思路:
首先,我将要插入的数分为三类:
1、要插入的数大于数组中所有的数。那么直接将要插入的数赋值给数组的结尾元素。
2、要插入的数小于数组中所有的数。那么将数组的所有元素整体向后移动一位,将要插入的数赋值给数组的首个元素。
3、要插入的数大小处在数组的中间位置。首先通过遍历数组结合if条件判断,找到应该插入的位置,然后将插入位置后面的元素整体向后移动一位,再将要插入的数赋值到刚才找到的位置。
程序代码:
#include <stdio.h>
int main(int argc, char *argv[])
{
int n, i, j;
int a[10] = {10,20,30,40,50,60,70,80,90};
int size = sizeof(a)/sizeof(int);
printf("插入之前数组为:");
for(i = 0; i < size-1; i++)
{
printf("%d ",a[i]);
}
printf("\n请输入你要插入数组的数:");
scanf("%d",&n);
if(n < a[0]){//输入的数比数组中最小的数还小
for(i = size-2; i >=0; i--){//将所有的数向后移动一位
a[i+1] = a[i];
}
a[0] = n;//将输入的数赋值给数组第一个元素
}
else if(n > a[size - 2]){//输入的数比数组中最大的数还大
a[size - 1] = n;//将输入的数放在数组最后的位置
}
else{
for(i = 0; i < size-2; i++)
{
if(n <= a[i+1] && n >= a[i]){//找到输入的数应该在的位置
for(j = size - 2; j >= i+1; j--){//将这个位置后面的元素往后移动一位
a[j+1] = a[j];
}
a[i+1] = n;//插入输入的数,插入后结束循环,否则还会进行插入
break;
}
}
}
printf("插入之后的数组为:");
for(i = 0; i < size; i++)
{
printf("%d ",a[i]);
}
putchar('\n');
return 0;
}
运行结果:
插入之前数组为:10 20 30 40 50 60 70 80 90
请输入你要插入数组的数:56
插入之后的数组为:10 20 30 40 50 56 60 70 80 90
插入之前数组为:10 20 30 40 50 60 70 80 90
请输入你要插入数组的数:8
插入之后的数组为:8 10 20 30 40 50 60 70 80 90
插入之前数组为:10 20 30 40 50 60 70 80 90
请输入你要插入数组的数:103
插入之后的数组为:10 20 30 40 50 60 70 80 90 103