排序算法——冒泡排序

算法描述(升序):

1、从初始位置开始,比较相邻两个元素的大小,即位置(0,1),如果“前元素”大于“后元素”,就将两个元素交换位置;

2、继续比较下一对相邻的元素,即位置(1,2),如果“前元素”大于“后元素”,就将两个元素交换位置;

3、重复上述步骤,直至到最后一对相邻元素,则此时整个数列的最大的元素,位于数列的末尾位置;

4、继续排序,重复一次步骤1、2。进行步骤3时,只需要比较到倒数第二对相邻元素即可,因为此时末尾已经是最大的元素。排序结束,此时数列最后两个元素,即是数列最大的两个元素。

5、每进行一次排序,数列的尾部就会按照升序添加一个新的元素。(即不用每次都一直比较到最后,第一次比较,比到最后,第二次比较,比到倒数第二个,第三次比较,比到倒数第三个,……)

图解(网图,侵删):

代码:

#include <iostream>
#include <vector>
using namespace std;
void bubbleSort(vector<int> &vec);
int main()
{
    vector<int> a = {86, 76, 62, 58, 77, 85, 92, 80, 96, 88, 77, 67, 80, 68, 88, 87, 64, 59, 61, 76};
    bubbleSort(a);
    for (auto i : a)
        cout << i << " ";
}
void bubbleSort(vector<int> &vec)
{
    bool tag;
    for (int i = 0; i < (int)vec.size() - 1; i++)
    {
        tag = true;
        for (int j = 0; j < (int)vec.size() - i - 1; j++)
        {
            if (vec[j] > vec[j + 1])
            {
                swap(vec[j], vec[j + 1]);
                tag = false;
            }
        }
        if (tag)
            return;
    }
}

算法分析:

最优情况:数列刚好是升序,一趟扫描就可以完成排序,比较次数为n-1,时间复杂度为O(n)

最坏情况:数列刚好是降序,需要进行n-1躺排序,比较次数为(n-1)+(n-2)+(n-3)+……+1=n*(n-1)/2,时间复杂度为O(n*n)

平均时间复杂度:O(n*n)

稳定性:相同元素的前后顺序没有改变(因为是当“>"的时候进行交换,不是”>=“),所以是一种稳定排序算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值