2.冒泡算法的优化

作者: KaelQ | 来源:发表于2016-08-01 17:48 被阅读680次

    1.冒泡算法

    抱歉。上个版本的文章确实有很大问题,大家的回复颠覆了我对冒泡排序的想法,在此谢谢大家。有个热心观众写的比我好些,他写了三种很好的优化方法。传送门

    • 所谓冒泡算法(Bubble)就是每次找出最大(小)的值,将其放到最后,然后再对剩余的数进行重复操作。
      第一个for循环:排除最后一个或几个已经排序好的数。a.length-1是因为数组从0开始。
      第二个for循环:找出剩余的数里的最大(小),放在最后。减去i,是为了排除已经排序好的元素。
      代码如下:
    for(inti=0;i<a.length-1;i++){
    for(intj=0;j<a.length-1-i;j++){
    if(a[j]>a[j+1]){
    temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;
    }
    }
    }
    

    时间复杂度为O(n^2),太高了。

    2.一层优化

    • 但是还是不够,因为有时候我们冒泡排序时,可能已经排好了,任然还在比较。这时候就需要一个flag进行判定。是否已经排好了,如果排好了就不进比较了。
    int a[n];
    int t;//交换容器
    bool flag=true;//判定
    for(inti=0;i<a.length-1;i++){
            flag=false;
    for(intj=0;j<a.length-1-i;j++){
    if(a[j]>a[j+1]){
    temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;
                flag=true;
    }
    }
    }
           if(!flag){
              break;
           }
    }
    

    这样子就会效率很多。

    3.最后结论

    冒泡算法简单但并不好,主要是时间复杂度太高。

    疑问:

    int a[n];
    int t;//交换容器
    for (int i = 0; i < n; i++) {
        for (int j = i+1; j < n; j++) {
            if (a[i] > a[j]) {
                t = a[j];
                a[j] = a[i];
                a[i] = t;
            }
        }
    }
    
    • 这种算法是什么排序呢?有没有热心观众解答一下。

    相关文章

      网友评论

        本文标题:2.冒泡算法的优化

        本文链接:https://www.haomeiwen.com/subject/egnxsttx.html