1.什么是冒泡排序?
冒泡排序(Bubble Sort),是一种 计算机科学领域的较简单的 排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的 元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中 二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
总的来说,就是一句话:
通过不断比较相邻元素,将大的元素放到数组后面,最终完成排序。
文字解释
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
那么接下来我们就举个例子来证明冒泡排序的过程:
2.怎么做?
设有六个数,分别为 2 3 5 6 1 4
接下来进行操作演示:
①:2 3 5 1 6 4
②: 2 3 1 5 4 6
③:2 1 3 4 5 6
④:1 2 3 4 5 6
这样的话冒泡排序就完成了
3.时间复杂度
在冒泡排序中,第 1 轮需要比较 n -1 次,第 2 轮需要比较 n -2 次……第 n -1 轮需 要比较 1 次。因此,总的比较次数为 (n -1) +(n -2) +…+1 ≈ (n^2)/2。这个比较次数恒定为该数值,和输入数据的排列顺序无关。
不过,交换数字的次数和输入数据的排列顺序有关。假设出现某种极端情况,如输 入数据正好以从小到大的顺序排列,那么便不需要任何交换操作;反过来,输入数据要 是以从大到小的顺序排列,那么每次比较数字后便都要进行交换。因此,冒泡排序的时间复杂度为 O(n^2 )。
4.两种不同的比较方法
相信大家都注意到了,文字说明与图文混合说明比较顺序是不同的。一个是把最大,第二大,第三大,...第n大依次放到后面;一个是把最小,第二小,...,第n小依次冒到前面。
不过,它们都是冒泡排序!
5.代码实现
#include <iostream>
#include <vector>
using namespace std;
void bubbleSort(vector<int>& nums) {
int n = nums.size();
bool swapped;
for (int i = 0; i < n-1; i++) {
swapped = false;
for (int j = 0; j < n-i-1; j++) {
if (nums[j] > nums[j+1]) {
swap(nums[j], nums[j+1]);
swapped = true;
}
}
// 如果一轮遍历没有发生交换,说明序列已经有序,提前结束排序
if (!swapped) {
break;
}
}
}
int main() {
vector<int> nums = {5, 2, 9, 1, 3};
cout << "原始序列:";
for (int num : nums) {
cout << num << " ";
}
cout << endl;
bubbleSort(nums);
cout << "排序后序列:";
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------
文章参考(鸣谢):