算法简介
冒泡排序 Bubble Sort 是最简单和最通用的排序方法,其基本思想是:在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直至最终完成排序。由此可得,在排序过程中,大的数据往下沉,小的数据往上浮,就像气泡一样,于是将这种排序算法形象地称为冒泡排序。
算法原理
- 从数列的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于(或小于)后一个元素,则交换它们的位置,使较大(或较小)的元素向后移动。
- 对数列中的每一对相邻元素重复执行上述比较和交换的操作,直到没有任何一对元素需要交换位置。
- 重复上述步骤,每次从数列的第一个元素开始,直到所有元素都按照顺序排列
其实前面说的都是费话
算法演示
基础版的
从小到大
初始数组(顺序表)
索引 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
值 | 2 | 4 | 1 | 3 |
第一轮
第一次比较
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,所以不交换
0 | 1 | 2 | 3 |
---|---|---|---|
2 | 4 | 1 | 3 |
第二次比较
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,所以交换
0 | 1 | 2 | 3 |
---|---|---|---|
2 | 1 | 4 | 3 |
第三次比较
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,所以交换
0 | 1 | 2 | 3 |
---|---|---|---|
2 | 1 | 3 | 4 |
第一轮结束
确定了最大值 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,所以交换
0 | 1 | 2 | 3 |
---|---|---|---|
1 | 2 | 3 | 4 |
第五次比较
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,所以不交换
0 | 1 | 2 | 3 |
---|---|---|---|
1 | 2 | 3 | 4 |
第二轮结束
确定了最大值 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,所以不交换
0 | 1 | 2 | 3 |
---|---|---|---|
1 | 2 | 3 | 4 |
排序结束
算法分析
基础版
时间复杂度
最好最坏平均都一样
n
n
n个数
共
n
−
1
n-1
n−1轮,第
k
k
k轮比较
n
−
k
n-k
n−k次
共比较
1
+
2
+
.
.
.
+
(
n
−
1
)
=
n
(
n
+
1
)
2
1+2+...+(n-1)=\frac{n(n+1)}{2}
1+2+...+(n−1)=2n(n+1)
省略多余项
O
(
n
2
)
O(n^2)
O(n2)
加强版
每轮记录比较次数,为
0
0
0 则结束
时间复杂度
1.最好 比较
n
−
1
n-1
n−1 次
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;
}
算法总结
时间慢 空间小 稳定