谁帮我解释一下这段代码的意思
#include<stdio.h>
#include<conio.h>
#define BUFFSIZE 100
int main()
{
char name[5][10],buff[BUFFSIZE];
int i,j,k,n;
n=0;
for(i=0;i<5;i++)
{
printf("Please input the name of %dth student:\n",i+1);
gets(buff);
if(strlen(buff)>10)
{
printf("the length of the name if larger than 10\n");
continue;
}
strcpy(name[i],buff);
}
for(j=0;j<5;j++) //采用选择排序的方法对学生名字进行排序
{
k=5-j;
for(i=0;i<5-j;i++)
if(strcmp(name[i],name[k])>0)
k=i;
if(k!=5-j)
{
strcpy(buff,name[k]);
strcpy(name[k],name[5-j]);
strcpy(name[5-j],buff);
}
}
for(i=0;i<5;i++)//这里也明白
printf("%s\n",name[i]);
return 0;
}
就是从“//采用选择排序的方法对学生名字进行排序”那里开始,我就不太懂了
前面的都看的七七八八了
后面的输出名字排序也明白了
中间那段有点绕哈哈
[解决办法]
里面 在j =0时全时越界行为啊,
重写了下 冒泡
for(j=0;j<5;j++)
{
for(i = 0;i<5-1 -j; i++)
{
if(strcmp(name[i],name[i+1])>0)
{
strcpy(buff, name[i]);
strcpy(name[i], name[i+1]);
strcpy(name[i+1], buff);
}
}
}
------解决方案--------------------
这是交换排序,排序思想就是对排序序列指定一个最开始的位置,然后每个元素都跟这个指定的元素比较,如果比他大(或者小,取决于想升序还是降序),就交换
编程思想如下:
//伪代码
for(i=0; i++; i<end)
{
k = i;
for(j=i+1; j++; j<end)
if(array[j] > array[k])
k = j;//也就是k = i那一步,此步骤是为了记录哪个元素比k大,此步保证了一轮循环后k记录着最大的那个元素的位置
if(k != i)//一轮过去后这说明出现了比k元素大的元素,k变化了,说明上边循环的那个if为真过
{
交换;
}
}
其中的k = i就是为了先记录比k位置的元素大的元素的位置,其实有些交换排序没有这一步,遇到比k大的就先交换,也是可以实现功能的,但是会多交换几次,效率会下降,有这一步,就会等第二个循环完了,交换一次就好了。
我写的那个排序思想k的初值是0,降序排序,你的那个程序k的初值是5,都是一样的,只不过开始端不一样而已