1. 算法步骤
(1)从左到右,比较相邻的两个元素,如果第一个数比第二个数大,就交换他们两个。
(2)对每对相邻元素作同样的工作,这样,最后的元素将会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2.动画演示
3.代码实现
#include<iostream>
#include<vector>
using namespace std;
// 冒泡排序算法
void bubbleSort(vector<int>&vec, int n)
{
for (int j = n; j >= 1; j--)
{
bool flag = true; // 标记变量,当遍历数组没有发生交换,代表数组有序,不需要继续排序
for (int i = 0; i < j - 1; i++)
{
if (vec[i] > vec[i + 1])
{
swap(vec[i], vec[i + 1]); // 当前一个元素大于后一个元素,交换元素位置
flag = false; // 发生交换时,代表数组不是有序数组
}
}
if (flag) return;
}
}
int main()
{
vector<int>vec = {3,5,15,36,26,27,2,38,4,44,19,46,47,48,50};
bubbleSort(vec, vec.size());
// 遍历打印数组元素
for (auto it : vec)
{
cout << it << " ";
}
return 0;
}
4.复杂度分析
时间复杂度
通过代码分析,该算法的最差时间复杂度为O(n^2),最优时间复杂度为O(n),平均时间复杂度为O(n^2)。
空间复杂度
O(1):在原数组上操作,即使使用了常数级空间O(1)。
5.稳定性
稳定