首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++冒泡法排序 有几行看不懂,该如何解决

2012-09-03 
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,退出循环。

[解决办法]
探讨

if (!flag)是什么意思?
引用:

这个程序是从小到大排列
for (i=0;i<5;++i)开始将flag赋值为false
在for (j=0;j<4-i;++j)这个循环中对把较大的数字向后交换,一旦交换flag设置为true
说明移动了数字,继续向下执行,因为flag为ture,不执行 if (!flag)里的break,向后执行打印出此时的排序情况……

热点排行