C语言数组选择排序法,超简单,求解

2025-06-26 00:11:38
推荐回答(3个)
回答1:

for语句有4个部分内容for ( A;B;C ) D;其中A是初始化语句,每个for只执行A一次,B是循环条件,每次循环前执行判断,如果不满足则结束循环,D是在满足循环条件时执行的,可以是一句或多句(多句时用大括号括起来做整体处理),C是在执行D之后进行的后续处理。for语句执行的顺序是:A,B,D,C,B,D,C,B,D,C,...,B结束

for ( i=0;i<9;i++ ) {
  iTemp=a[i]; iPos=i;
  for ( j=i+1;j<10;j++ ) {
    if ( a[j]  }
  a[iPos]=a[i]; a[i]=iTemp;
}

假设数组a中输入了十个数为:1,2,5,4,6,8,7,9,10,3,通过手动单步执行程序(把自己当成计算机),分析理解for语句的含义。

i=0;[i=0],i<9成立,开始循环
  iTemp=a[i];[iTemp=a[0]=1],iPos=i;[iPos=0]
  j=i+1;[j=0+1=1],j<10成立,开始循环:a[j]  j++;[j=2],j<10成立,继续循环:a[j]  j++;[j=3],j<10成立,继续循环:a[j]  j++;[j=4],j<10成立,继续循环:a[j]  ... //没有条件满足让if语句条件能得到执行,因为a[1]~a[9]都不小于iTemp
  j++;[j=10],j<10不成立,结束循环
  a[0]=a[0]; a[0]=1;实际上a[0]值未变,通过以上处理a[0]保存a[0]之后所有数组中最小值
i++;[i=1],i<9成立,继续循环
  iTemp=a[i];[iTemp=a[1]=2],iPos=i;[iPos=1]
  j=i+1;[j=2],j<10成立,开始循环:a[j]  j++;[j=3],j<10成立,继续循环:a[j]  ... //没有条件满足让if语句条件能得到执行,因为a[2]~a[9]都不小于iTemp
  j++;[j=10],j<10不成立,结束循环
  a[1]=a[1]; a[1]=2;实际上a[1]值未变,通过以上处理a[1]保存a[1]之后所有数组中最小值
i++;[i=2],i<9成立,继续循环
  iTemp=a[i];[iTemp=a[2]=5],iPos=i;[iPos=2]
  j=i+1;[j=3],j<10成立,开始循环:a[j]  j++;[j=4],j<10成立,继续循环:a[j]  ...
  j++;[j=9],j<10成立,继续循环:a[j]  j++;[j=10],j<10不成立,结束循环
  a[9]=a[2]; a[2]=3;通过以上处理a[2]与a[2]之后所有数组中最小值的a[9]值互换
  现在数组变成: 1,2,3,4,6,8,7,9,10,5
...//每次i循环都会导致当前a[i]与之后最小值的元素互换值,结果是a[i]保存之后最小值
i++;[i=9],i<9不成立,结束循环  
至此数组按照从小到大顺序排序

上述循环中,i值指定当前要处理的元素,j值负责每次提供之后所有元素下标,在进行比较后,当前i指向元素会与之后最小值进行交换,保证当前元素是之后元素中最小的,从而进行9次这样的处理后数组按顺序已经排好序了。

回答2:

#include
struct Student
{
char num[10];
char name[10];
int score[4];
};
main()
{
struct Student exc,stu[5]={{"5001","zhang",85,82,75,66,},
{"5002","liu",75,85,92,78},{"5003","li",66,88,93,85},
{"5004","huang",82,72,80,77},{"5005","wang",92,75,73,83}};
int a,all[5]={0},i,j;
for(i=0;i<5;i++)
for(j=0;j<4;j++)
all[i]+=stu[i].score[j];
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(all[j]{
exc=stu[j];
stu[j]=stu[j+1];
stu[j+1]=exc;
a=all[j];
all[j]=all[j+1];
all[j+1]=a;
}
printf("按总分降序排列如下:\n");
for(i=0;i<5;i++)
{
printf("%s %-6s ",stu[i].num,stu[i].name);
for(j=0;j<4;j++)
printf("%d ",stu[i].score[j]);
printf("%d \n",all[i]);
};
}

回答3:

for(j=i+1;j<10;j++)
变量j,从i位置的后一个开始,直到数组的最后一个。