[求助]关于排序的问题!
题目:图书馆有若干本图书,现在图书顺序比较混乱,请你按图书名(字符的字典顺序)的顺序对它们进行排序,并输出排序后的内容.#include<stdio.h>
#include<string.h>
#define N 5
void sort(char *name[],int n);
void print(char *name[],int n);
int main()
{
static char name[][80]={"e","d","c","b","a"};
char *point[N];
int j;
for(j=0;j<N;j++)
point[j]=name[j];
sort(point,N);
return 0;
}
void sort(char *name[],int n)
{
char *temp;
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)
k=j;
}
if(k!=i)
{
temp=name[i];
name[i]=name[k];
name[k]=temp;
}
}
void print(char *name[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",name[i]);
}
问题:在void sort(char *name,int n){}这个函数中的排序,内循环, for(j=i+1;j<n;j++){};每循环一次k的值就被赋一次,那k岂不是没有作用了,还有,if(k!=i)是等内循环完后才排序,那怎么解释,好像达不到排序的效果,要是把if(k!=i){}中的语句放在内循环里我能理解!
----------------解决方案--------------------------------------------------------
有作用啊,k始终指着第i次循环按字典序最靠前的数!并且把这个数放到第i个位置.那就是k!=i要交换的原因.
----------------解决方案--------------------------------------------------------
还不是很明白,郁闷,这个问题好了两个多月!
----------------解决方案--------------------------------------------------------
能详细点吗,把上面排序的过程说一遍?
----------------解决方案--------------------------------------------------------
开始时候是这样:'e','d','c','b','a'.i=1;两两比较但不交换.K指向'a';k!=i;'a''e'交换.i=2还剩下'b','c','d','e',再两两比较,此时k指向b,'d'!=b;再交换...............如此下去.
----------------解决方案--------------------------------------------------------
问题: i=0,j=1时 d,e比较,k=1; j=2 e,c比较k=2,j=3........k=3,j=4......k=4; 这里k不是连续被赋值吗?
执行完一轮内循环后再执行
if(k!=i)此时i=0,k=4啦;
{
temp=name[0];
name[0]=name[4];
name[4]=temp;
}
我是这样理解的呀,究竟怎么搞的,我都混乱了,照我这样说k好像连续被赋值了,这样达不到冒泡的效果呀?!
----------------解决方案--------------------------------------------------------
k可以被连续赋值啊.它指向内循环最小的数;这是冒泡法的简化可以减少交换的次数.每次内循环最做只进行一次交换就可以了.
----------------解决方案--------------------------------------------------------
k被连续赋值,指向内循环的最小数也就是说,当k被赋1,2,3,4;它始终指向1吗?
或者是这样理解当那个内循环运行完一轮后k就被赋1,2,3,4;因为第一轮的时候因为两两对比都让if(k!=i)成立,因此就执行
if(k!=i){}里面的语句,里面这是这样执行:
当k=1时执行一次交换,k=2再执行一次交换,直到k=4时执行完成,然后回到第二次外循环,是不是这样理解?
----------------解决方案--------------------------------------------------------
不是的一次内循环最多执行一次交换.k是被连续赋值但 if(strcmp(name[k],name[j])>0) k=j;语句执行完了k的值就固定了.此次内循环的最小值就是a[j](=a[k]);k!=i(即j!=i)时a[i],a[k]交换后a[i]即第i次循环最小值.懂了吗?我只能说到这里了.
----------------解决方案--------------------------------------------------------
谢谢!
----------------解决方案--------------------------------------------------------