c++冒泡法排序 有几行看不懂,该如何解决
c++冒泡法排序 有几行看不懂C/C++ code#include iostream#include iomanipusing namespace stdint ma
c++冒泡法排序 有几行看不懂
C/C++ code#include <iostream>#include <iomanip>using namespace std;int main(){ int i,j,k,t; bool flag;//这一行看不懂 int a[]={8,6,9,7,4}; for (i=0;i<5;++i) { flag=false;//这一行 for (j=0;j<4-i;++j) { if (a[j]>a[j+1]) { t=a[j];a[j]=a[j+1];a[j+1]=t; flag=true;//这一行 } } if (!flag)//这个if { break; } for (k=0;k<5;++k) { cout<<setw(3)<<a[k]; } cout<<endl; }}
书上只说这几行可以减少重复排序 但没说为什么
我看不很懂 求教大家
[解决办法]这个程序是从小到大排列
for (i=0;i<5;++i)开始将flag赋值为false
在for (j=0;j<4-i;++j)这个循环中对把较大的数字向后交换,一旦交换flag设置为true
说明移动了数字,继续向下执行,因为flag为ture,不执行 if (!flag)里的break,向后执行打印出此时的排序情况
继续循环。。。。若已经为从小到大排列,就不会执行if (a[j]>a[j+1])里面的flag=true, if (!flag)就执行break跳出循环
[解决办法] 一般的冒泡排序算法一般会进行L->length – 1次外部循环,但是有时候数组在循环到一半时就已经排序好了,但是这时循环还是不断的进行下去,一直做比较操作,尽管没有交换数据,但是做了很多不必要的比较操作。
我们可以在程序中设置一个flag标志位,当发现这一轮中没有交换动作时,就表明该数组是排序好的,这样就可以设置flag为false,退出循环。
[解决办法]