冒泡排序也叫起泡排序,顾名思义,就是将目标元素像水中的泡泡一样升到(升序排列)对应的位置。可以说是所有排序算法中最简单、最易实现的算法了。
算法思路
对 n 个数据进行排序,从待排序序列中找出一个最大值(升序排列)或最小值(降序排列),然后放到序列末尾,这样的操作执行 n-1 次,最终就可以得到一个有序序列。
算法过程
1、从数组开头比较相邻的两个元素。如果第一个比第二个大,就交换它们两个;
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3、对数组中所有的元素重复以上步骤,末尾已经处理过的元素不需要再操作。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
例如数组[14, 5, 86, 22, 6, 54, 30, 54, 29]:
1、从数组开头进行相邻元素的比较,比较14,5,交换它们的位置[5, 14, 86, 22, 6, 54, 30, 54, 29],......,直到最后,数组中的最大值86像泡泡一样“浮到”数组末尾[5, 14, 22, 6, 54, 30, 54, 29, 86];
2、对剩余元素[5, 14, 22, 6, 54, 30, 54, 29]进行排列,找到最大值54,“浮到”数组倒数第二个位置,得到数组[5, 14, 6, 22, 30, 54, 29, 54, 86];
3、重复上述步骤,直到所有元素都被处理,得到最终的有序序列[5, 6, 14, 22, 29, 30, 54, 54, 86]。
代码实现
伪代码
BubbleSort(array):
for i from 0 to array.size() - 1{ // n个元素需遍历 n-1 次
for j from 0 to array.size() - 1 - i{ //
if array[j] > array[j+1]{ // 若进行降序排序,则改成 < 小于号
swap(array[j] , array[j+1]); // 交换 2 个相邻元素的位置
}
}
}
return array; // 返回排好序的序列
c++代码函数实现
//冒泡排序
void BubbleSort(vector<int>& arr) {
for(int i = 0; i < arr.size() - 1; i++) {
for (int j = 0; j < arr.size() - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int tem = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tem;
}
}
}
}
测试
#include <bits/stdc++.h>
using namespace std;
void BubbleSort(vector<int>& arr) {
for(int i = 0; i < arr.size() - 1; i++) {
for (int j = 0; j < arr.size() - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int tem = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tem;
}
}
}
}
int main() {
vector<int> arr{ 14, 5, 86, 22, 6, 54, 30, 54, 29};
cout << "before sort: " << endl;
for (auto a : arr) {
cout << a << "\t";
}
cout << endl;
BubbleSort(arr);
cout << "after sort: " << endl;
for (auto a : arr) {
cout << a << "\t";
}
cout << endl;
system("pause");
return 0;
}
输出