懂C语言帮忙注释下这个程序!

void sort()
{
struct person temp;
int i.j.k;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(st[k].no>st[j].no)
k=j;
if(k!=i)
{ temp=st[k];
st[k]=st[i];
st[i]=temp; }
}
}
这个是从一个程序里提出来的,选择排序法,帮忙注释下,小弟看不懂啊

struct person st[MAX];
int n=0;
/**
* @brief
* 选择排序:
* 假定数组中存在一个分界值,
* 分界值前面的为已排序部分,分界值后面为未排序部分(最初已排序部分为0个,所以第0个数据就是分界值)。
* 选择排序外层循环进行n-1次,每次选出未排序部分的最小值来与分界值交换。
* 这样当前的分界值就加入到“已排序部分”,分界值位置向后移动一个。
* 当分界值到达n-1时,排序完成。
* @param 无
* 无参数;
* 隐含入参:全局变量struct person数组st
* 隐含入参:全局变量n,表示数组st中数据的个数
* @return void
*/
void sort()
{
struct person temp; /* 用于交换的临时变量 */
int i,j,k; /* i,j为循环变量,k用于记录未排序部分和分界值的最小值的下标 */
/* 以下的“最小值”均指“未排序部分和分界值”中的最小值 */
for(i=0;i<n-1;i++) /* 外层循环n-1次,i就是分界值下标; 找到新的最小值之后,i++,表示分界值后移 */
{
k=i; /* k为最小值下标,默认分界值最小 */
for(j=i+1;j<n;j++)/* 对所有未排序部分进行查找 */
if(st[k].no>st[j].no) /* 如果有比当前最小值更小的,就把k改为那个更小值的下标 */
k=j;
if(k!=i) /* 如果k==i,表示分界值就是最小值,则不用交换;k!=i则需要交换 */
{
/* 这里进行交换(分界值与最小值) */
temp=st[k];
st[k]=st[i];
st[i]=temp;
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-14
void sort()
{
struct person temp; //定义了一个临时person结构体
int i.j.k; //下面是两重循环,用来排序,原理是
for(i=0;i<n-1;i++) //把数组0-n的值分别于其后的值进行循环比较,如果大于后者,就将其位置交换,循环进行,皆可以排序成功了
{ // i的取值0-n-1,及分别取出数组中各个值,用于与其后的值进行比较
k=i;
for(j=i+1;j<n;j++) //j=i+1,及时从i后面的一个值取起,循环到n-1,分别于i所在的比较
{
if(st[k].no>st[j].no)//如果i所在的值大于后面的
k=j; //记录下j所在的位置
if(k!=i) //如果j不等i,就要交换位置了
{ temp=st[k]; //暂存i所在的值到temp
st[k]=st[i]; //将j所在的放在i的位置上
st[i]=temp; } //将temp暂存的值放到j所在的位置上,交换完成,循环完成全部排序
}
}
}
希望你能看明白,如果还不明白,就先搜一下简单的几种排序算法吧,再来看看程序本回答被提问者采纳
第2个回答  2012-07-14
先把第一个数分别跟后面每个数比较,如果第一个数大于后面的数的话就交换两个数的位置,小于的话就不交换;
再从第二个数分别跟后面每个数比较,如果第二个数大于后面的数的话就交换两个数的位置,小于的话就不交换;
以此类推。。。就得到了一个从小到大的排序序列。
这其实是一个冒泡排序,你可以到网上找点资料看看。
第3个回答  2012-07-14
void sort()
{
struct person temp;
int i.j.k;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(st[k].no>st[j].no)//比较俩个元素的大小,并将小元素的下标赋值给K
k=j;
if(k!=i)//如果K改变过,则进行值的替换,将最小的值放于 st[i]
{ temp=st[k];
st[k]=st[i];
st[i]=temp; }
}
}
选择排序法在网络上有动画解释的,和好玩很好理解