[编程入门]数组插入处理
时间限制: 3s 内存限制: 192MB 提交: 47002 解决: 28148
题目描述
已有一个已正序排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。
输入格式
第一行,原始数列。 第二行,需要插入的数字。
输出格式
排序后的数列
样例输入
复制
1 7 8 17 23 24 59 62 101 50
样例输出
复制
1 7 8 17 23 24 50 59 62 101
错误代码:
#include <stdio.h>
#include <math.h>
#define N 100
int main(void)
{
int arr[N],n;
for(int i=0;i<9;i++)
{
scanf("%d ",&arr[i]);
}
scanf("%d",&n);
for(int i=0;i<9;i++)
{
if(n>arr[i])//错因1
{
for(int j=i+1;j<9;j++)//错因2
{
arr[j+1]=arr[j];
}
arr[i+1]=n;//错因3
}
}
for(int i=0;i<=9;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
实现代码:
#include <stdio.h> #include <math.h> #define N 100 int main(void) { int arr[N],n; for(int i=0;i<9;i++) { scanf("%d ",&arr[i]); //输入原始数列 } scanf("%d",&n); //输入需要插入的数字 for(int i=0;i<9;i++) //遍历数组 { if(n<arr[i]) /*若比当前数组值小,则停下放在其之前(其实上是 占据其位置,把当前数组挤到后面去)*/ { for(int j=9;j>i;j--) //从后面开始,不要从前面开始会有问题 { arr[j]=arr[j-1]; //新数字插入之后的数组元素往后排 } arr[i]=n; //放入新数字到当前数组位置 break; } } for(int i=0;i<=9;i++) { printf("%d\n",arr[i]); } return 0; }
错误原因:
1.数组遍历时若从前开始,则if的条件是n<arr[i](直到找到比其大的数);若从后开始,才是n>arr[i](直到找到比其小的数)
2. for(int j=i;j<9;j++)
{arr[j+1]=arr[j];}这样往后移的话,arr[7]=arr[6],arr[8]=arr[7].......这样后面的值其实都是arr[6]的值,因为先把前面的移动了再往后移时其原本位置存储的数据已经发生变化了,所以先从后面开始移动。