| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 566 人关注过本帖
标题:[求助]关于排序的问题!
只看楼主 加入收藏
lucis009
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2007-5-2
收藏
 问题点数:0 回复次数:9 
[求助]关于排序的问题!
题目:图书馆有若干本图书,现在图书顺序比较混乱,请你按图书名(字符的字典顺序)的顺序对它们进行排序,并输出排序后的内容.
#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){}中的语句放在内循环里我能理解!
搜索更多相关主题的帖子: 图书 图书馆 include 
2007-06-06 12:46
风之舞鹤
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2007-6-2
收藏
得分:0 

有作用啊,k始终指着第i次循环按字典序最靠前的数!并且把这个数放到第i个位置.那就是k!=i要交换的原因.


2007-06-06 18:18
lucis009
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2007-5-2
收藏
得分:0 
还不是很明白,郁闷,这个问题好了两个多月!
2007-06-06 21:12
lucis009
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2007-5-2
收藏
得分:0 
能详细点吗,把上面排序的过程说一遍?
2007-06-06 21:23
风之舞鹤
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2007-6-2
收藏
得分:0 

开始时候是这样:'e','d','c','b','a'.i=1;两两比较但不交换.K指向'a';k!=i;'a''e'交换.i=2还剩下'b','c','d','e',再两两比较,此时k指向b,'d'!=b;再交换...............如此下去.


2007-06-06 21:59
lucis009
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2007-5-2
收藏
得分:0 
问题: 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好像连续被赋值了,这样达不到冒泡的效果呀?!
2007-06-06 22:30
风之舞鹤
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2007-6-2
收藏
得分:0 

k可以被连续赋值啊.它指向内循环最小的数;这是冒泡法的简化可以减少交换的次数.每次内循环最做只进行一次交换就可以了.


2007-06-07 16:50
lucis009
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2007-5-2
收藏
得分:0 
k被连续赋值,指向内循环的最小数也就是说,当k被赋1,2,3,4;它始终指向1吗?

或者是这样理解当那个内循环运行完一轮后k就被赋1,2,3,4;因为第一轮的时候因为两两对比都让if(k!=i)成立,因此就执行
if(k!=i){}里面的语句,里面这是这样执行:
当k=1时执行一次交换,k=2再执行一次交换,直到k=4时执行完成,然后回到第二次外循环,是不是这样理解?
2007-06-07 18:27
风之舞鹤
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2007-6-2
收藏
得分:0 

不是的一次内循环最多执行一次交换.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次循环最小值.懂了吗?我只能说到这里了.


2007-06-08 15:39
lucis009
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2007-5-2
收藏
得分:0 
谢谢!
2007-06-10 23:46
快速回复:[求助]关于排序的问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.052477 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved