先声明:所有的排序我都会总结记录在博客里,最后会有一个大的cpp文件包含全部排序的代码,每个排序算法放在单独的一个namespace里面,清晰明了,并设计对数器给出测试。我会把它放到网盘供需要之人下载,见这里。 ps:所有的排序以升序为基准。测试编译器为Visual C++
冒泡排序思想:比较交换,行为类似于大的往下沉,小的往上冒,故名冒泡排序(Bubble Sort)。
属于交换类排序。
属于稳定排序(稳定,stable:即如果a==b,在原序列中a在b前面,排序完后a依旧在b前面)。这里有一点要注意,如果一个排序是稳定的,我们肯定能把它实现成不稳定的(改一下< or <=),但是,探讨稳定性我们一般公认的是它能不能被实现成稳定的。
BubbleSort代码:
template<typename T>
inline void swap(T& a, T& b) {
T c(a);
a = b;
b = c;
}
template<typename T>
void bubblesort(T* arr, int size) {
if (size <= 0)
return;
for (int i = size - 1; i > 0; --i) {
for (int j = 0; j < i; ++j) {
if (arr[j + 1] < arr[j]) { // 如果T是user-defined类型,需要重载operator<
swap(arr[j], arr[j + 1]);
}
}
}
}
测试程序: 这不是重点,我以图片形式给出。

结果:

一共需 n-1 趟,平均时间复杂度为 O(N^2)。
若正序,最好时间复杂度为 O(N)。
若逆序,最坏时间复杂度为 O(N^2)。
这个还可以稍微优化一下,如果某一趟没有一个元素交换了,说明已经有序了,用一个标志位flag记录一下就行。但是,丝毫不会影响平均复杂度 O(N^2)。
纸上得来终觉浅,绝知此事要躬行。
本文介绍了冒泡排序的基本原理、C++代码实现、稳定性特征,以及其时间复杂度分析。作者还分享了优化思路和测试实践,旨在通过实例加深读者对冒泡排序的认识。
402

被折叠的 条评论
为什么被折叠?



