基础算法之冒泡排序

物理
基础算法之冒泡排序

用户头像
Silicon(硅)『对酒当歌』 更新于2025-8-24 11:49:57

冒泡排序


〇、返回

Screenshot_2025-08-24-15-06-40-455.jpg


一、概述

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。


二、工作原理及算法步骤

1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个。

2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

3. 针对所有的元素重复以上的步骤,除了最后一个。

4. 持续每次对越来越少的元素重复上面的直到没有任何一对数字需要比较。


三、代码实现(C++)

#include<bits/stdc++.h>

using namespace std;

int main() {

    int n;

    cin>>n;

    vector<int> a(n);

    for (int i=0;i<n;i++) {        // 读入数组

        cin>>a[i];

    }

    for (int i=1;i<=n;i++) {        // 操作次数

        bool flag=true;        // 数组是否已经排好序

        for (int j=0;j<n-i;j++) {        // 步骤1、2

            if (a[j]>a[j+1]) {

                swap(a[j],a[j+1]);

                flag=false;

            }

        }

        if (flag==true) {        // 如果已经排好序就退出循环

            break;

        }

    }

    for (int i=0;i<n;i++) {        // 输出数组

        cout<<a[i]<<" ";

    }

    cout<<"\n";

    return 0;

}


四、时空复杂度及稳定性

时间复杂度

最坏情况时间复杂度:O($n^2$)(当输入数组是反向排序的时候)

最好情况时间复杂度:O(n)(当输入数组已经是排序好的时候)

平均情况时间复杂度:O($n^2$)

空间复杂度

冒泡排序的空间复杂度为 O(1),因为它只需要一个额外的临时变量来进行交换操作。

稳定性

冒泡排序是一种稳定的排序算法,即相等的元素在排序前后相对位置不变。


五、总结

冒泡排序虽然简单,但在大多数情况下并不是最优的排序算法,特别是在数据量较大的情况下。然而,它对于理解排序算法的基本概念和原理非常有帮助。在实际应用中,更高效的排序算法如快速排序、归并排序等更为常用。

收起
11
3
共5条回复
时间正序
用户头像
Silicon(硅)『对酒当歌』
9月前
答疑楼
11条评论
用户头像
Harry·四维碎片
9月前

有人解释一下时空复杂度是什么意思吗?🤔(本人萌新

用户头像
Silicon(硅)『对酒当歌』 回复 Harry·四维碎片
9月前

明天出帖子

用户头像
落花时节又逢君:)
9月前

算法不是STL、贪心、二分那种吗???

用户头像
陨星尘(等待下一位选手
9月前
代码示例可以加点注释吗,短的代码还能一眼看懂,要是长了……那就很头疼了
用户头像
Silicon(硅)『对酒当歌』 回复 陨星尘(等待下一位选手
9月前

OK。

用户头像
Silicon(硅)『对酒当歌』 回复 落花时节又逢君:)
9月前

……

建议回去重修基础知识

用户头像
落花时节又逢君:) 回复 Silicon(硅)『对酒当歌』
9月前

可是我在语法的时候就学排序了啊???

用户头像
Silicon(硅)『对酒当歌』 回复 落花时节又逢君:)
9月前

那是你学死了,算术是变通的,编程也是变通的

用户头像
落花时节又逢君:) 回复 Silicon(硅)『对酒当歌』
9月前

…我承认,我编程并不好

用户头像
Silicon(硅)『对酒当歌』 回复 Silicon(硅)『对酒当歌』
9月前

出算法复杂度的帖子了!

用户头像
落花时节又逢君:) 回复 Silicon(硅)『对酒当歌』
9月前

[期待]

用户头像
英语不行的豆渣(投稿中
9月前
实际上很难打出实战😥
用户头像
爱寨的黑芝麻汤圆
9月前

快速排序(quick),选择排序(select),堆排序(stack),希尔排序(shell)不稳定,其余都稳定,俗称快选堆稀扔掉大脑3.png

5条评论
用户头像
爱寨的黑芝麻汤圆
9月前

有人打今年csp吗,我打j组跟s组

用户头像
Silicon(硅)『对酒当歌』
9月前

归并排序是体验感最好的排序,时间复杂度是基于比较的排序算法中最快的,而且不管什么情况都是O(n log n),还稳定,还能顺带解决顺、逆序对问题,还有专门的库函数stable_sort,虽然空间复杂度是O(n)的,但是本身存储数组就要O(n)的空间,不可能再加一个O(n)就MLE了。

用户头像
Silicon(硅)『对酒当歌』 回复 Silicon(硅)『对酒当歌』
9月前

归并排序,唯一真神

用户头像
Ray 1439 回复 爱寨的黑芝麻汤圆
9月前

我打,但估计最后还是要走数竞。问一下你们都用哪本书来学信奥,我用《算法竞赛》。

用户头像
爱寨的黑芝麻汤圆 回复 Ray 1439
9月前
我用的书比较多不固定,不过都差不多,好多名字都一样
用户头像
:P‘aralogism
9月前
提个小建议:可以给全文都放美元符号中,要不然中间插一个latex忽上忽下有点难受
1条评论
用户头像
Silicon(硅)『对酒当歌』
9月前

但是这样很容易出问题,还不好排查

用户头像
Seven-Fox 柒狐
9月前

佬,是不是复杂了。。。

#include<bits/stdc++.h>

using namespace std;

int n,a[10005];

int main{

    cin>>n;

    for(int i=0 ;i<n ;i++ ) cin>>a[i];

    for(int i=0 ;i<n ;i++ ){

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

            if(a[j] < a[j+1]) swap(a[j] , a[j+1]);

        }

    }

    for(int i=0 ;i<n ;i++) cout<<a[i];

    return 0;

}

2条评论
用户头像
Silicon(硅)『对酒当歌』
9月前

没复杂啊,就是多了一个判断是否已经有序了,如果已经有序了还遍历什么,对吧

$\small{你输出后面忘加空格了}$

用户头像
Seven-Fox 柒狐 回复 Silicon(硅)『对酒当歌』
9月前

哦~知道了,谢谢1.png