【算法笔记】【排序算法】简单的冒泡排序详解

算法简介

冒泡排序 Bubble Sort 是最简单和最通用的排序方法,其基本思想是:在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直至最终完成排序。由此可得,在排序过程中,大的数据往下沉,小的数据往上浮,就像气泡一样,于是将这种排序算法形象地称为冒泡排序。

算法原理
  1. 从数列的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于(或小于)后一个元素,则交换它们的位置,使较大(或较小)的元素向后移动。
  1. 对数列中的每一对相邻元素重复执行上述比较和交换的操作,直到没有任何一对元素需要交换位置。
  1. 重复上述步骤,每次从数列的第一个元素开始,直到所有元素都按照顺序排列

其实前面说的都是费话

算法演示

基础版的

从小到大

初始数组(顺序表)

索引0123
2413

第一轮

第一次比较

i = 0 i=0 i=0
比较 i i i i + 1 i+1 i+1项,即 2 2 2 4 4 4
因为 2 < 4 2<4 2<4,所以不交换

0123
2413

第二次比较

i = 1 i=1 i=1
比较 i i i i + 1 i+1 i+1项,即 4 4 4 1 1 1
因为 4 > 1 4>1 4>1,所以交换

0123
2143

第三次比较

i = 2 i=2 i=2
比较 i i i i + 1 i+1 i+1项,即 4 4 4 3 3 3
因为 4 > 3 4>3 4>3,所以交换

0123
2134

第一轮结束

确定了最大值 4 4 4

第二轮

第四次比较

i = 0 i=0 i=0
比较 i i i i + 1 i+1 i+1项,即 2 2 2 1 1 1
因为 2 > 1 2>1 2>1,所以交换

0123
1234

第五次比较

i = 1 i=1 i=1
比较 i i i i + 1 i+1 i+1项,即 2 2 2 3 3 3
因为 2 < 3 2<3 2<3,所以不交换

0123
1234

第二轮结束

确定了最大值 3 3 3

第三轮

第六次比较

i = 0 i=0 i=0
比较 i i i i + 1 i+1 i+1项,即 1 1 1 2 2 2
因为 1 < 2 1<2 1<2,所以不交换

0123
1234

排序结束

算法分析

基础版
时间复杂度
最好最坏平均都一样
n n n个数
n − 1 n-1 n1轮,第 k k k轮比较 n − k n-k nk
共比较 1 + 2 + . . . + ( n − 1 ) = n ( n + 1 ) 2 1+2+...+(n-1)=\frac{n(n+1)}{2} 1+2+...+(n1)=2n(n+1)
省略多余项 O ( n 2 ) O(n^2) O(n2)

加强版
每轮记录比较次数,为 0 0 0 则结束
时间复杂度
1.最好 比较 n − 1 n-1 n1 O ( n ) O(n) O(n)
2.平均、最坏 O ( n 2 ) O(n^2) O(n2)

空间复杂度
都一样 O ( 1 ) O(1) O(1)

稳定性
稳定,相同元素相对位置不会发生改变

算法实现

Python3

def bubble_sort(nums):
    for i in range(len(nums)-1):
        for j in range(len(nums) - i - 1):
            if nums[j] > nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
    return nums

print(bubble_sort([45, 32, 8, 33, 12, 22, 19, 97]))

C++

#include <iostream>
using namespace std;
int main()
{
    int len = 5;
    int a[5] = {5, 4, 3, 2, 1};
    for (int i = 0; i <= len - 1; i++)
    {
        for (int j = 0; j < len - i - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                swap(a[j], a[j + 1]);
            }
        }
    }
    for (int i = 0; i < len; i++)
    {
        cout << a[i] << ' ';
    }
    cout << endl;
    return 0;
}
算法总结

时间慢 空间小 稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值