10.3 交换排序(1)冒泡排序

本文介绍了冒泡排序的基本思想,通过相邻元素之间的比较和交换来实现排序。提供了模板化的C++实现代码示例,并展示了排序过程中的每一步变化。分析了冒泡排序的时间复杂度为O(n²),空间复杂度为O(1),并解释了其稳定性的原因。

基本思想

冒泡排序的思想和其名字一样直观,把整个表看作一个水池,数据看作石头,重的自然沉下去而轻的会浮上来。当然在程序里面,直接沉下去和直接浮上来都是不可能的,因此冒泡排序就是相邻元素进行比较,如果逆序了,就相互交换,如此迭代直到序列有序为止。
冒泡排序每次迭代产生的有序区都是有序的(注意参考下面的实现理解)。

实现

template<typename _Ty>
void bubble_sort(std::vector<_Ty> & a){
    for (int i = 0; i < a.size() - 1; i++){
        for (int j = a.size() - 1; j > i; j--)
            if (a[j] < a[j - 1])
                std::swap(a[j], a[j - 1]);
        output_list(a);
    }
}

对于一组测试数据5 4 11 18 1 70 35 90 100 2,输出每一次迭代的结果如下:

1       5       4       11      18      2       70      35      90      100
1       2       5       4       11      18      35      70      90      100
1       2       4       5       11      18      35      70      90      100
1       2       4       5       11      18      35      70      90      100
1       2       4       5       11      18      35      70      90      100
1       2       4       5       11      18      35      70      90      100
1       2       4       5       11      18      35      70      90      100
1       2       4       5       11      18      35      70      90      100
1       2       4       5       11      18      35      70      90      100

时间空间复杂度及稳定性

冒泡排序使用了两层循环,第一层循环迭代n1次,而内层循环则每次从最后一个元素开始迭代到当前i的位置之前。因此不难得出总的时间复杂度是O(n2)的,并且对于任何情况,内层循环都是如此执行(if语句跟是否已经有序没有影响),都满足O(n2)的时间复杂度。
空间复杂度是O(1)的,因为只用了几个临时变量。
稳定性来说,冒泡排序是稳定的。设A[t1]=A[t2],其中t1<t2,那么A[t2]所对应的元素被冒泡到A[t1+1]时,就不满足if语句的条件,也就不会被换到A[t1]之前。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值