原理
把⼩的元素往前调或者把⼤的元素往后调,⽐较是相邻的两个元素⽐较,交换也发⽣在这两个元素之间。
- 外循环表示需要N-1轮循环
- 内循环表示每轮循环需要比较的次数
- 如果前面的元素比后面的大,则交换
实现
//bubbleSort
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::swap;
using std::vector;
void bubbleSort(vector<int>& nums) {
int len = nums.size();
bool flag = false;
for (int i = 0; i < len - 1; i++) {
flag = false;
for (int j = 0; j < len - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
flag = true;
swap(nums[j], nums[j + 1]);
}
}
if (!flag) {
break;
}
}
}
void print(const vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
cout << nums[i] << " ";
}
cout << endl;
}
void test() {
vector<int> nums = { 1,4,7,2,5,8 };
print(nums);
bubbleSort(nums);
print(nums);
}
int main() {
test();
return 0;
}
bubbleSort性能
- 时间复杂度:O(n^2)
- 空间复杂度: O(1)
- 稳定排序:如果 a 原本在 b 的前⾯,且 a == b,排序之后 a 仍然在 b 的前⾯,则为稳定排序
- 原地排序:不申请多余的存储空间