小弟在学习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;” 行不行?谢谢!
1 flag标志用来判断当前是否已经有序。当一趟排序结束后,如果flag=0者表示没有发生过交换,数组已经有序,无需再做下去。 2 程序比较次数由双重循环变量i,j控制。所以说去处flag后程序完全可以正常运行,不会出现死循环,也可以得到正确的结果。 3 那么为什么加flag呢,从第一点可以看出,并不是所有的数据都要做完所以的比较(n个数需要n-1趟比较),很多情况下比较几此后数据已经有序,此时如果有flag标志的话就可以及早结束程序得到结果。而没有flag的话必须做完n-1趟比较。 所以,flag主要提高效率。举一个极端例子,假定原始数据已经有序,有flag标志只要比较一趟。而没有flag标志要比n-1趟.
应该是没有影响的,你可以去看看冒泡的算法,窝同意一楼的说法
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;那么在数字还未达到指定位置之前是不会输出这个数字的(要不然排序岂不错误了)
flag应该是个自定义的标志变量,如果发生过位置,就把flag设为1,否则为0,也就是说这个flag是用来判断原数组是否为有序数组的。不定义flag,没有“flag=0;”和“flag=1;”及“if(flag==0)break;”对冒泡排序本身没有影响
答:软件开发工程师就业培训 ·课程教材采用李刚老师亲自编写、并已公开出版的J2EE教材、全程由李刚老师亲自授课。 ·打造名企技术经理,成为中国软件产业的中流砥柱:全...详情>>