2.冒泡排序

2.冒泡排序

2.1冒泡排序的思想和复杂度

冒泡思想

冒泡排序,顾名思义就是像气泡一样,大小不一的气泡会依次逐个交换位置,然后形成从小到大的顺序。冒泡排序可以从左向右冒泡,也可以从右向左冒泡,但正宗的冒泡是从右向左的。意思就是说如果要排成从小到大的顺序,就要从最右端向最左端扫描并交换。

时间和空间复杂度

时间复杂度如表所示

算法 平均情况 最好情况 最差情况
冒泡 O(N^2) O(N) O(N^2)

空间复杂度:O(1)

2.2冒泡排序的操作

假设有这样一个数组vec:

下标 0 1 2 3 4 5 6 7 8 9
数组 4 3 5 2 1 9 8 6 0 7

对这个数组进行冒泡排序,我们首先设定一个外层循环 i (0<i<N-1),循环次数为N=vec.size()。然后在每个外层循环的内层循环 j (i+1<j<N-1)中进行扫描。内层循环的目的是为了从右向左扫描,通过依次相邻比较的方式找到最小的数,放到数组vec的最左边i的位置上,下一次内循环之前i++,就不再扫描这个最小的数字了。外层循环的目的是为了保证排序完成后的每一个数字都是经过冒泡放在了正确的位置上,而不遗漏对每个数字的冒泡。

内层循环(i<j<number-1, j--)

可以通过下表理解内层循环中一次扫描中的交换:

指针 i j
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j-1 j
更新数组 4 3 5 2 1 9 8 6 0 7
指针 i j-1 j
更新数组 4 3 5 2 1 9 8 0 6 7
指针 i j-1 j
更新数组 4 3 5 2 1 9 0 8 6 7
指针 i j-1 j
更新数组 4 3 5 2 1 0 9 8 6 7
指针 i j-1 j
更新数组 4 3 5 2 0 1 9 8 6 7
指针 i j-1 j
更新数组 4 3 5 0 2 1 9 8 6 7
指针 i j-1 j
更新数组 4 3 0 5 2 1 9 8 6 7
指针 i j-1 j
更新数组 4 0 3 5 2 1 9 8 6 7
指针 i&j-1 j
更新数组 0 4 3 5 2 1 9 8 6 7

外层循环(0<=i<vec.size(), i++)

可以通过下表理解外层循环的交换:

指针 i
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i
更新数组 0 4 3 5 2 1 9 8 6 7
指针 i
更新数组 0 1 4 3 5 2 6 9 8 7
指针 i
更新数组 0 1 2 4 3 5 6 7 9 8
指针 i
更新数组 0 1 2 3 4 5 6 7 8 9
指针 i
更新数组 0 1 2 3 4 5 6 7 8 9
...

到这里实际上已经排序完成了。

优化

为了提高冒泡排序的效率,我们在代码里加一个flag,用这个flag来检查是不是已经排序完成了。冒泡排序完成以后是不会再有数字交换的情况了,所以我们用flag来记录是否进行了交换,如果没有交换,那么我们就认为排序完成,不再进行外层循环。
OK, 可以上代码了。

2.3 C++代码###

#include <iostream>
#include <vector>
using namespace std;

class Sort
{
public:
    void bubble(vector<int> &vec)
    {
        int number=vec.size();
        vector<int> nullvec;
        if(number==0)return;
        bool flag=true;
        for(int i=0;i<number && flag;i++)
        {
            flag=false;
            for(int j=number-1;j>i;j--)
            {
                if(vec[j-1]>vec[j])
                {
                    exch(vec,j-1,j);
                    flag=true;
                }
            }
            show(vec);
        }
    }
    void show(vector<int> &vec)
    {
        for(int i=0;i<vec.size();i++)
        {
            cout << vec[i] << " ";
        }
        cout << endl;
    }
    vector<int> init()
    {
        vector<int> vec;
        int arr[10]={4,3,5,2,1,9,8,6,0,7};
//        int arr[10]={9,8,7,6,5,4,3,2,1,0};
        vec.insert(vec.begin(),arr,arr+10);
        cout <<"ori:"<<endl;
        show(vec);
        cout <<"-------------------"<<endl;
        return vec;
    }
    bool checkorder(vector<int> &vec)
    {
        for(int i=0;i<vec.size()-1;i++)
        {
            if(vec[i]>vec[i+1])return false;
        }
        return true;
    }
private:
    void exch(vector<int> &vec,int a,int b)
    {
        int tmp;
        tmp=vec[a];
        vec[a]=vec[b];
        vec[b]=tmp;
    }
};

int main()
{
    Sort sortob;
    vector<int> mvec=sortob.init();
    sortob.bubble(mvec);
    cout <<"------result-------"<<endl;
    if(sortob.checkorder(mvec))
        sortob.show(mvec);
    else
    {   cout << sortob.checkorder(mvec);
    }
    return 0;
}

输出结果:

image.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • 常见问题: 对数组{5,18,21,1,3,62,7}进行从小到大的排序,使用冒泡排序算法。 1.什么是冒泡排序?...
    陈文洁945阅读 280评论 0 0
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,338评论 0 1
  • 之前给大家介绍的桶排序想必让大家狠狠的爽了一把给别人排成绩的乐趣哈哈,不过它只能给成绩排序,这些成绩如果对应着人呢...
    寒枝旧廊阅读 376评论 2 3
  • 冒泡排序 1.冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样...
    疯狂的喵喵阅读 321评论 1 2
  • 那天是升上初三的第二天,快要上课的时候,李天杰望了望门口,想看看即将教他们数学的老师是谁。 直到上课前的1分钟才有...
    烛影摇红_06ba阅读 1,521评论 2 4