| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 975 人关注过本帖
标题:[求助]数组编写问题,请指教
只看楼主 加入收藏
xiaohei0536
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-8-3
收藏
 问题点数:0 回复次数:15 
[求助]数组编写问题,请指教

输入5个学员的成绩,按降序排列。用C程序实现冒泡排序法。
#include <stdio.h>
#define N 5
void main()
{
int i,j;
int grade[N],temp;

printf("\n 请输入%d个学员的成绩:\n",N);
for(i=0;i<N;i++)
{
scanf("%d",&grade[i]);
}

for(i=0;i<N;i++)
{
for(j=0;j<N-i-1;j++)
{
if(grade[j]<grade[j+1])
{
temp=grade[j+1];
grade[j+1]=grade[j];
grade[j]=temp;
}
}
}
printf("\n 排序后的成绩为:\n");
for(i=0;i<N;i++)
{
printf("%d ",grade[i]);
}
printf("\n");
}
问题:for(j=0;j<N-i-1;j++)是什么意思。请详细解释。

搜索更多相关主题的帖子: 组编 指教 
2007-08-03 15:40
奔跑的鸟
Rank: 1
等 级:新手上路
帖 子:391
专家分:0
注 册:2006-1-20
收藏
得分:0 

i=0时候,你要把第一个元素和后面的每一个都比较一次,N个元素就要比较N-1次,这次比较完成后,最后一个肯定是最小的,此时,最后一个元素不需要再次比较,因此比上次少比较一次,而i恰好每次增加1,因此比较次数是N-i-1


简单的快乐着~
2007-08-03 15:52
jianweichief
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2007-7-18
收藏
得分:0 

#include <stdio.h>
#define N 5
void main()
{
int i,j;
int grade[N],temp;

printf("\n 请输入%d个学员的成绩:\n",N);
for(i=0;i<N;i++)
{
scanf("%d",&grade[i]);
}

for(i=0;i<N;i++)
{
for(j=1;j<N;j++)
{
if(grade[i]<grade[j])
{
temp=grade[j];
grade[j]=grade[i];
grade[i]=temp;
}
}
}
printf("\n 排序后的成绩为:\n");
for(i=0;i<N;i++)
{
printf("%d ",grade[i]);
}
printf("\n");
}



看看对不对

[此贴子已经被作者于2007-8-3 17:06:48编辑过]


2007-08-03 17:01
奔跑的鸟
Rank: 1
等 级:新手上路
帖 子:391
专家分:0
注 册:2006-1-20
收藏
得分:0 
可以,但是有大约一半的比较无意义

简单的快乐着~
2007-08-03 18:16
jianweichief
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2007-7-18
收藏
得分:0 
以下是引用奔跑的鸟在2007-8-3 18:16:23的发言:
可以,但是有大约一半的比较无意义

我出学,请您指教一二,呵呵


2007-08-03 18:19
奔跑的鸟
Rank: 1
等 级:新手上路
帖 子:391
专家分:0
注 册:2006-1-20
收藏
得分:0 
冒泡法原理就是逐个比较,先找到最小的或者最大的放到最后(具体是最小还是最大看你按升序还是降序排序),因此第一次内循环后最后一个已经是最小(大)的了,第二次就不用和他再比较了,而你的内循环是从头比较到尾,因此第二次多比较一次,第三次多比较两次......以此类推,所以说你有大约一半的比较是无意义的
你第二个程序是冒泡法么?..........难道是我好久不用c忘了..............

[此贴子已经被作者于2007-8-3 18:30:28编辑过]


简单的快乐着~
2007-08-03 18:27
奔跑的鸟
Rank: 1
等 级:新手上路
帖 子:391
专家分:0
注 册:2006-1-20
收藏
得分:0 
算了,这论坛怎么不能炸楼啊.......你那个程序好象是不行的,刚我没仔细看
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(grade[j]<grade[j+1])
{
temp=grade[j];
grade[j]=grade[i];
grade[i]=temp;
}
}
我开始看成这个了......

简单的快乐着~
2007-08-03 18:34
leeldy
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2007-8-2
收藏
得分:0 
#include <stdio.h>
#define N 5
void main()
{
int scor[N],temp;
int i,j,flag;
for(i=0;i<N;i++)
scanf("%d",&scor[i]); /*输入成绩*/

for(i=0;i<N;i++) /*冒泡法开始*/
{
for(j=0;j<N-i-1;j++)
{
flag=0;
if(scor[j]>scor[j+1]) /*与相邻进行比较*/
{ /*交换将大数沉下去*/
temp=scor[j];
scor[j]=scor[j+1];
scor[j+1]=temp;
flag=1;
}
}
if(flag==0)break; /*当不在发生交换时,排序结束*/
}

for(i=0;i<N;i++)
printf("%d",scor[N]) /*输出*/
}

[此贴子已经被作者于2007-8-3 23:22:13编辑过]


↑↑↑↑↑↑↑↑如果我错了,请改正我的错误↑↑↑↑↑↑↑↑

2007-08-03 20:11
leeldy
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2007-8-2
收藏
得分:0 
选择法改写,不知道有没有错误

#include <stdio.h>
#define N 5
void main()
{
int scor[N],temp;
int i,j,min;
for(i=0;i<N;i++)
scanf("%d",&scor[i]); /*输入成绩*/

for(i=0;i<N;i++) /*选择法开始*/
{
min=i;
for(j=i+1;j<N;j++)
if(scor[i]>scor[j]) /*记录小数的下标*/
min=j;
if(min!=i)
{
temp=scor[i]
scor[i]=scor[min] /*将最小数放到前面*/
scor[min]=temp
}
}

for(i=0;i<N;i++)
printf("%d",scor[N]) /*输出*/
}

[此贴子已经被作者于2007-8-3 23:22:40编辑过]


↑↑↑↑↑↑↑↑如果我错了,请改正我的错误↑↑↑↑↑↑↑↑

2007-08-03 20:20
leeldy
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2007-8-2
收藏
得分:0 
问题:for(j=0;j<N-i-1;j++)是什么意思。请详细解释。

冒泡法的特点就是通过比较两相邻数,通过交换,将较大的数(或较小的数)沉到最后,从而实现排序。
for(j=0;j<N-i-1;j++)这个循环是比较交换相邻数的循环
j<N-i-1:就你的程序而言,每完成一个j的循环就会产生一个最小数放到grade[N-i-1]位置,所以下一次j的值要小于N-i-1

厄,我还以为是从小到大排序,我的那个冒泡法是从小到大排序,随便改一下就可以了。

↑↑↑↑↑↑↑↑如果我错了,请改正我的错误↑↑↑↑↑↑↑↑

2007-08-03 20:28
快速回复:[求助]数组编写问题,请指教
数据加载中...
 
   



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

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