排序算法之冒泡排序及C++实现

本文介绍了冒泡排序的基本原理、C++代码实现、稳定性特征,以及其时间复杂度分析。作者还分享了优化思路和测试实践,旨在通过实例加深读者对冒泡排序的认识。

先声明:所有的排序我都会总结记录在博客里,最后会有一个大的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]);
            }
        }
    }
}

测试程序: 这不是重点,我以图片形式给出。
test

结果:
result
一共需 n-1 趟,平均时间复杂度为 O(N^2)。
若正序,最好时间复杂度为 O(N)。
若逆序,最坏时间复杂度为 O(N^2)。

这个还可以稍微优化一下,如果某一趟没有一个元素交换了,说明已经有序了,用一个标志位flag记录一下就行。但是,丝毫不会影响平均复杂度 O(N^2)。

纸上得来终觉浅,绝知此事要躬行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值