关于C语言程序设计中的一个题目(已经排好的序的数组插入数后重新排列,该如何处理
关于C语言程序设计中的一个题目(已经排好的序的数组插入数后重新排列
有一个已经排好的序的数组,及今输入一个数,要求按原来排序的规律将它插入数组中。
程序如下
#include <stdio.h>
void main()
{
int a[11]={1,4,6,9,13,16,19,28,40,100};
int num,i,j;
printf( "array a:\n ");
for(i=0;i <10;i++)
printf( "%5d ",a[i]);
printf( "\n ");
printf( "insert data: ");
scanf( "%d ",&num);
if(num> a[9])
a[10]=num;
else
{
for(i=0;i <10;i++)
if(a[i]> num)
{
for(j=9;j> =i;j--)
a[j+1]=a[j];
a[i]=num;
break;
}
}
printf( "now,array a:\n ");
for(i=0;i <11;i++)
printf( "%5d ",a[i]);
printf( "\n ");
}
我要问的是。。。
为什么是
if(num> a[9])
a[10]=num;
不是a[10]最大吗?
既然都定义了a[11],为什么不是a[10]呢?
插入的数num比a数组最后一个数大,讲其插入的数放在a数组末尾...
但是为什么是a[9]呢?。。。
for(j=9;j> =i;j--)
a[j+1]=a[j];
a[i]=num;
break;
这段也不是很懂。。。
------解决方案--------------------
for(j=9;j> =i;j--)
a[j+1]=a[j];
a[i]=num;
break;
这段也不是很懂。。。
-----------------------------------
if(num> a[9])
a[10]=num; //num比a[9]大则num插入到最后
else
{
for(i=0;i <10;i++) //如果num比a[9]小则从第一个数开始比较
if(a[i]> num) //只到num比a[i]小则将num插入到a[i]
{
for(j=9;j> =i;j--) //要把num插入到a[i]就必须把a[i]到a[9]的所有数依次后移一位
a[j+1]=a[j];
a[i]=num;
break;
}
}
------解决方案--------------------
呵呵,这很简单呀。
你要先分析下算法。
对于向一个排序好的数组中插入数字,我们需要考虑两种情况:
第一:正常插入。即要插入的数字不比最大的数字大,先让比插入数字大的都向后移动,
然后再让数字插入相应的位置。
第二:非正常插入。即要插入的数字比最大的数字大,这时候不需要移动数字,只需要
直接把数字放在最大数字的后面一个里面就可以了。
你所问的就是第二种情况的处理。
因为a[9]里面存的是最大的数字,如果要插入的数字大于a[9]那么我们则需要,让a[9]
后面的元素a[10]等于要插入的数字。
所以也就有了上的语句
if(num> a[9])
a[10]=num;
有一个已经排好的序的数组,及今输入一个数,要求按原来排序的规律将它插入数组中。
程序如下
#include <stdio.h>
void main()
{
int a[11]={1,4,6,9,13,16,19,28,40,100};
int num,i,j;
printf( "array a:\n ");
for(i=0;i <10;i++)
printf( "%5d ",a[i]);
printf( "\n ");
printf( "insert data: ");
scanf( "%d ",&num);
if(num> a[9])
a[10]=num;
else
{
for(i=0;i <10;i++)
if(a[i]> num)
{
for(j=9;j> =i;j--)
a[j+1]=a[j];
a[i]=num;
break;
}
}
printf( "now,array a:\n ");
for(i=0;i <11;i++)
printf( "%5d ",a[i]);
printf( "\n ");
}
我要问的是。。。
为什么是
if(num> a[9])
a[10]=num;
不是a[10]最大吗?
既然都定义了a[11],为什么不是a[10]呢?
插入的数num比a数组最后一个数大,讲其插入的数放在a数组末尾...
但是为什么是a[9]呢?。。。
for(j=9;j> =i;j--)
a[j+1]=a[j];
a[i]=num;
break;
这段也不是很懂。。。
------解决方案--------------------
for(j=9;j> =i;j--)
a[j+1]=a[j];
a[i]=num;
break;
这段也不是很懂。。。
-----------------------------------
if(num> a[9])
a[10]=num; //num比a[9]大则num插入到最后
else
{
for(i=0;i <10;i++) //如果num比a[9]小则从第一个数开始比较
if(a[i]> num) //只到num比a[i]小则将num插入到a[i]
{
for(j=9;j> =i;j--) //要把num插入到a[i]就必须把a[i]到a[9]的所有数依次后移一位
a[j+1]=a[j];
a[i]=num;
break;
}
}
------解决方案--------------------
呵呵,这很简单呀。
你要先分析下算法。
对于向一个排序好的数组中插入数字,我们需要考虑两种情况:
第一:正常插入。即要插入的数字不比最大的数字大,先让比插入数字大的都向后移动,
然后再让数字插入相应的位置。
第二:非正常插入。即要插入的数字比最大的数字大,这时候不需要移动数字,只需要
直接把数字放在最大数字的后面一个里面就可以了。
你所问的就是第二种情况的处理。
因为a[9]里面存的是最大的数字,如果要插入的数字大于a[9]那么我们则需要,让a[9]
后面的元素a[10]等于要插入的数字。
所以也就有了上的语句
if(num> a[9])
a[10]=num;