冒泡排序 --跳出循环的break的flag值放错位置

用到的一个检验 就是说 如果已经排序好了 就不用走那么多趟了,在while循环里有个if

如果满足条件就把flag设为真,则不跳出,如果没有执行就跳出这个循环,现在只不过是这个if外面多了一个for循环

实质是一样的。

#include<iostream>
using namespace std;


int main(){
       int i=1;
       bool flag;
       while(i<8){
              flag = false;
              i++;

//之前做都是直接在while里有个if如果满足某个条件就改变flag值现在只不过是多了for而已

              for (int j=0;j<8-i+1;j++){


                     if( ){
                            //做一些事情
                            flag=true;
                     }
              }//内部for
              //检验是否还有交换然后跳出while循环
              if(!flag) break;


       }
       return 0;
}



#include<iostream>
using namespace std;
void insert_sort(int a[], int n);




int main()
{
 	
    int a[]= { 3,7,2,9,6,5,8,1,4};
    insert_sort(a,9);
	system("pause"); 
    return 0;


}




void insert_sort(int a[], int n)
{


    int i=1, j, temp;
    bool flag;




    while(i<n)
    {
        i++;


        //@3@ 每一趟都会把flag为false 如果交换了 就设为true,跑完一趟末尾检验是否跳出
        //while 循环 ,当排序好了之后呢由于没有交换则flag为假就跳出了。
        flag = false;
        /* @1@
                        //j的范围本来应该是从数组下标为零到n-i-1所以j<(n-i)
                        //但这次用的是while循环i已经长了个1 所以改成 j<(n-i+1)
             */
        for(j=0; j<(n-i+1); j++)
        {
            /* @2@
                //最后报错是因为不恰当的跳出循环
                //本来是想每一趟循环只有没有交换的时候才跳出
                //但是把flag = false;
                写入下面之后每个数比较都要重新设置flag
                那么如果最后几个比较的数没有移动就会引起跳出了,所以如果
                后面的顺序排好了,就会减少几趟排序,那么前面可能没有排好的也跳出来了


            */
            //flag = false;
            if(a[j]>a[j+1])
            {
                //如果交换了数据令flag为真
                flag = true;
                temp = a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }




        }
        /*
        @4@ 这一段主要是打印每一趟的排序结果来查看到底是哪次排序出错了
        cout<<i-1<<"趟:";
        for (int k = 0; k < n; ++k){
        cout<<a[k]<<" ";
             }
             cout<<endl<<"----"<<endl;
             */
        if(!flag) break;


    }






    for (i = 0; i < n; ++i)
    {
        cout<<a[i]<<" ";
    }
}//insert 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值