C语言的数组排序问题。

来源:百度知道 编辑:UC知道 时间:2024/06/30 08:43:32
在已排序的数组中插入一数据,是插入后的数据仍有序,填空。
#include<stdio.h>
void main()
{
int i,x,a[20]={2,4,5,7,8,12,13,18};
printf("Input an integer to be inserted x:");
scanf("%d",&x);// 设输入: x=9;
i=8;
while(x<a[i-1]&&i>0)
{ a[i]=a[________]; i--; }
a[___________]=x;
for(i=0;i<n+1;i++)
printf("%3d",a[i]); printf("\n");
}//结果为:2,4,5,7,8,9,12,13,18
帮忙分析下,谢谢大侠了!

简单的末位比较排序,从最后一个数a[i-1]开始和x比较,大于x的向后移一位,比如a[i-1] > x,就将a[i-1]的数值写给a[i],所以第一个空应该添i-1。最后比较到a[4]的时候while循环跳出,这个时候的数据x要回填到a[5]的位置,所以第二个空应该添i++或i+1。

所以说答案是:
第一个填 i-1
第二个填 i++或i+1

最后顺便说句,楼主,for循环里面条件有问题,n+1变量是错误,你要么在前面定义int n = strlen(a),要么在这个地方修改为8+1。

修改后并经过测试的代码如下:
#include<stdio.h>
void main()
{
int i,x,a[20]={2,4,5,7,8,12,13,18};
printf("Input an integer to be inserted x:");
scanf("%d",&x);// 设输入: x=9;
i=8;
while(x<a[i-1]&&i>0)
{ a[i]=a[i-1]; i--; }
a[i++]=x;
for(i=0;i<9;i++)
printf("%3d",a[i]); printf("\n");
}
//结果为:2,4,5,7,8,9,12,13,18

自己用手动算一下就好了,不复杂

第一个横线 i-1
第二个是 i

第一个是 i-1
第二个是 i

第一个填 i-1
第二个填 i

补充:
for(i=0;i<n+1;i++) 中的n+1改成9

第一个是i-1,是反过来循环的
第二个是i,从i>0 的条件很容易看到,如果加入的是第一条最后i=0 ,从其它的也可以看出来,但比较难一点