C语言 数组中插入数字,并从大到小排列数组中数据。请问下面代码如何理解。谢谢!

main()
{
int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18};初始化数组,变量。
for(i=0;i<10;i++)循环数组中的元素
{ p=i;q=a[i]; 数据定义为P,下标为q;
for(j=i+1;j<10;j++)循环数据j。
if(q<a[j]) {p=j;q=a[j];}下标比较如果q<a[j],则较大的j取代i值的位置。(这句理解的对吗?)
if(p!=i)如果现在p中的值,不再等于i,则下标互换位置。
{
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%d ",a[i]);
}
printf("\ninput number:\n");
scanf("%d",&n);这句以下我就不太懂了。如何将所有的数据往后移一位(甚至几位)。
for(i=0;i<10;i++)
if(n>a[i])
{for(s=9;s>=i;s--) a[s+1]=a[s];
break;}
a[i]=n;
for(i=0;i<=10;i++)
printf("%d ",a[i]);
printf("\n");
}

先说你不懂之后的那些代码,这是标准的插入排序算法——
scanf("%d",&n); // 读入一个新的数字n

for(i=0;i<10;i++)
if(n>a[i]) //现在的数组a是从大到小排序的,所以如果发现有小于n的数组元素a[i],n就应该取代a[i]的位置

{for(s=9;s>=i;s--) a[s+1]=a[s]; //先把a[i]之后的元素全部后移一格,于是a[i+1]的值变成了a[i]的值,a[i+2]变成了先前a[i+1]的值,等等。

break;}
a[i]=n; //再把n赋值给a[i],一个新的插入就此完成。

再说前面的那一段,这里是对初始化完毕的、已经含有若干元素的数组做选择排序——
for(j=i+1;j<10;j++)
if(q<a[j]) {p=j;q=a[j];}下标比较如果q<a[j],则较大的j取代i值的位置。(这句理解的对吗?)--不对,不是取代i值的位置,而是将它作为当前找到的最大值记录下来。这里的主要思路是,先选出数组中最大的元素,放在第一位;接着再从余下的数字中找出最大的,放在第二位,依此类推。

if(p!=i)如果现在p中的值,不再等于i,则下标互换位置。--〉这其实就是把找到的最大的数放在i位置。i之前的数字已经按照从大到小的次序排列完毕。
{
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%d ",a[i]);
}
温馨提示:答案为网友推荐,仅供参考