排序算法——冒泡排序(写给初学者)

简介

英文名:Bubble Sort
是一种简单的排序算法
由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

步骤

以下用数组2,5,8,3,6,9,1,4,7为例
从小到大排序

1.遍历数组,找到不符合规律的一对
  • 首先是2和5,符合,过
    在这里插入图片描述

  • 然后5和8,也没有问题
    在这里插入图片描述- 接着8和3就不符合了,所以开始进行处理
    在这里插入图片描述

2.将不符合规律的一对交换

在这里插入图片描述

3.重复1,2步直到遍历完
  • 接下来8和6交换
    在这里插入图片描述
  • 然后8和9是符合规律的,虽然8是被我们一直交换过来的,但它遇到了更大的数,所以就被抛弃了,跳过它
    在这里插入图片描述
  • 接着就是9与后面的数比较与交换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 这样一次遍历过后,最大的数就被我们交换到了最后,即9这个数已经排序完毕
4.从头开始,重复1,2,3步,但注意因为9已经排序完毕,所以最后一个数不用遍历
  • 接下来是第二次遍历

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

后面步骤就不再给出了,可以自己写一下

代码

  • 从以上过程可得,遍历一次就能排序一个数,因此n个数需要n-1次遍历,这就是第一重循环

  • 第二重循环就是遍历所有未排序的数,将最大数交换到最后或最小数交换到最前

  • 假设我们每次从第二个数开始,与前一个数比较

  • 那么第一次我们需要循环的下标就是
    在这里插入图片描述- 第二次是
    在这里插入图片描述- 最后一次
    在这里插入图片描述

  • 我们可以发现每次j初始不变,上限减一,因此为了方便我们可以使用i作为j的上限也就是i的值从len-1到1

  • 此外,若数组前几次就已经排完,按上面想法还会循环多次,所以我们使用一个标记来让它排完就结束

#include <iostream>
using namespace std;
void BubbleSort(int a[],int l)
{
    int ans;
    int temp;
    for(int i=l-1;i>=1;i--)//一重循环,n-1次
    {
		ans=1;
        for(int j=1;j<=i;j++)//第二个数到未排序数
        {
            if(a[j-1]>a[j])
            {
                ans=0;//有未排序的
//                temp = arr[j];
//                arr[j] = arr[j + 1];
//                arr[j + 1] = temp;
                swap(a[j],a[j-1]);//交换
                for(int k=0;k<l;k++)//打印数组
                    cout<<a[k]<<" ";
                cout<<endl;
            }

        }
        if(ans)//额外标记
            break;

    }
}
int main()
{
    int a[20]={2,5,8,3,6,9,1,4,7};
    int b[20] = {1,1,1,1,1,1,1,1,1};
    int len=9,temp;
    BubbleSort(a,len);
    return 0;
}


特性

1.时间复杂度

最好情况就是全部有序,此时只需遍历一次,因此冒泡排序最好的时间复杂度为 O ( n ) O(n) O(n)
最坏情况全部反序,两重for循环全部执行,因此冒泡排序的最坏时间复杂度为 O ( n 2 ) O(n^2) O(n2)

综上,因此冒泡排序总的平均时间复杂度为 O ( n 2 ) O(n^2) O(n2)

2.空间复杂度

最优的空间复杂度就是不需要借用第三方内存空间,则复杂度为0
最差的空间复杂度就是开始元素逆序排序,每次都要借用一次内存,按照实际的循环次数,为 O ( n ) O(n) O(n)

平均的空间复杂度为: O ( 1 ) O(1) O(1)

3.算法稳定性

相同元素的前后顺序是否改变
在这里插入图片描述

因为只交换不同大小的,所以冒泡排序是稳定的

小测试

  • 在上面代码中,打印的数组是这样的
    在这里插入图片描述
  • 你能否改变代码,使得冒泡排序从后向前遍历,优先将最小数交换到前面?
    在这里插入图片描述
  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值