| 小弟在学习C 的冒泡排序时遇到这样一个疑问现向大家请教: |
★★★ |
| 小弟在学习C 的冒泡排序时遇到这样一个疑问现向大家请教: |
|
作者:搜集 文章来源:阿达 更新时间:2007-6-7 2:21:15  |
|
小弟在学习C 的冒泡排序时遇到这样一个疑问现向大家请教:
小弟在学习C++的冒泡排序时遇到这样一个疑问:
#include <iostream.h>
void main()
{
int a[6]={1,7,3,12,9,5};
int i,j,t,flag;
for(i=0;i<5;i++)
flag=0;
for(j=0;j<6-i-1;j++)
if(a[j]>a[j+1])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
flag=1;
}
if(flag==0)break;
for(i=0;i<6;i++)
cout<<a[i]<<endl;
}
我想问一下,int flag的作用是什么?不定义flag,没有“flag=0;”和“flag=1;”及“if(flag==0)break;”
行不行?谢谢!
最佳答案此答案由提问者自己选择,并不代表新浪爱问知识人的观点
回答:wm3699 级别:新手 2004年12月21日
1 flag标志用来判断当前是否已经有序。当一趟排序结束后,如果flag=0者表示没有发生过交换,数组已经有序,无需再做下去。
2 程序比较次数由双重循环变量i,j控制。所以说去处flag后程序完全可以正常运行,不会出现死循环,也可以得到正确的结果。
3 那么为什么加flag呢,从第一点可以看出,并不是所有的数据都要做完所以的比较(n个数需要n-1趟比较),很多情况下比较几此后数据已经有序,此时如果有flag标志的话就可以及早结束程序得到结果。而没有flag的话必须做完n-1趟比较。
所以,flag主要提高效率。举一个极端例子,假定原始数据已经有序,有flag标志只要比较一趟。而没有flag标志要比n-1趟.
揪错 ┆ ┆ 举报
提问者对答案的评价:
感谢wm3699的精彩解答
其他回答
如果有了满意的回答请及时采纳,不要辜负了回答者 怎样采纳答案
回答:深_蓝2001 级别:学弟 2004年12月20日
flag应该是个自定义的标志变量,如果发生过位置,就把flag设为1,否则为0,也就是说这个flag是用来判断原数组是否为有序数组的。不定义flag,没有“flag=0;”和“flag=1;”及“if(flag==0)break;”对冒泡排序本身没有影响
┆ 举报
回答:peach 级别:学弟 2004年12月20日
flag不能去掉,冒泡程序就是一次比较数组相近的两个数,然后不停的把小些的那个数往数组前面移.
而flag的作用就是看看是否已经把小些的数移到相应位置了.
1号for循环:for(i=0;i<5;i++)有六个数,所以执行五次循环
2号for循环:for(j=0;j<6-i-1;j++)每个数要经过6-i-1次循环才能移到相应的位置
2号是嵌套在1号里面的,所以2号循环完才会再次循环1号.
在2号循环中一旦数组数字改变位置了,flag就会为非0.也就是说此时这个数字还未到达指定位置,有了if(flag==0)break;那么在数字还未达到指定位置之前是不会输出这个数字的(要不然排序岂不错误了)
┆ 举报
回答:noah_fz 级别:新手 2004年12月21日
应该是没有影响的,你可以去看看冒泡的算法,窝同意一楼的说法
┆ 举报
|
| 文章录入:admin 责任编辑:admin |
|
上一篇文章: FTP 架设成以后,无法访问文件夹?…
下一篇文章: 电脑-开始-我最近的文档,出了问题怎么办? |
|
|
|
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |