冒泡排序

冒泡排序

冒泡排序是一种较为简单的算法。它重复走访过要排序的元素,依次比较两个相邻的元素。走访元素的工作是重复地进行直到没有元素需要交换,也就是说该元素已经排序完毕了。算法名字由来是因为越小的元素由交换会慢慢“浮”到数列的顶端,就好像气泡一样,所以被称为”冒泡排序“

第一种做法(每次都把小的往前放)

void BubbleSort(vector<int> &vec){
    int len = vec.size();//计算该数组的长度
    if(len<2){
        return; //如果数组的个数小于2,等于说没有数据或者只有它本身!
    }for(int i=0;i<len;++i){//一个一个来排,有多少数就排多少次
        for(int j=len-1;j>i;--j){//每次都把该范围内最小的数挪到最前面
            if(vec[j]<vec[j-1]){
                swap(vec[j],vec[j-1]);//如果后一个比前一个小就交换
            }         
        }
    }
}

第二种做法(每次把大的往后排)

void BubbleSort(vector<int> &vec){
    int len = vec.size();
    if(len<2){
        return;
    }for(int i=0;i<len-1;i++){//这里有-1的细节,因为到了最后一个就不用再排序了
        for(int j=0;j<len-i-1;j++){
            if(vec[j]>vec[j+1]){
                swap(vec[j],vec[j+1]);
            }
        }
    }
}

上述两种代码都很简单,但是出现了一种问题,那就是存在一种排好序了还再进行遍历排序,这样会很浪费空间和时间。那么这个代码要如何优化好呢?其实思考一个细节,如果我们再进行排序遍历的时候,里面的if语句执行的话,如果有标记说明进行了交换操作就好了,然后进行下一次遍历的时候重置标记,以此类推。于是就出现了一种冒泡排序优化后的算法。

优化后的冒泡排序(以改良第一种算法为例)

void BubbleSort(vector<int> &vec){
    int len = vec.size();
    if(len<2){
        return;
    }for(int i=0;i<len;++i){
        bool flag = false;//用bool数据类型做标记,int也是可以的
        for(int j = len-1;j>i;--j){
            if(vec[j]<vec[j-1]){
                swap(vec[j-1],vec[j]);
                flag = true;
            }
        }
        if(flag==false){
            return;
        }
    }
}

补充一下swap(swap就是C++自带的库中已经写好的方法,原理如下)

void swap(int a,int b){
    int temp = a;
    a = b;
    b = temp;
}
posted @ 2022-03-02 01:09  霜鱼CC  阅读(7)  评论(0)    收藏  举报