冒泡排序以及冒泡排序的进阶优化

冒泡排序的基本原理就是第一个与第二个比,将大的放在后面;第二个和第三个比,大的放后面,一直到最后一个元素与前面的比。过程如下:

我们发现这一趟下来最大的数字已经在最后面了,那么我们将这个过程多次循环,就可以逐步挑选最大的数字到最后。因为每次将最大的数找到了,就可以缩小这个范围一直到最后一个:

代码写出来就是这样,一般写成函数:

冒泡排序的优化:

我们可以看到上面图例,整个排序到倒数第四步就已经排好序,这里就可以提前结束循环:

这里我们就可以用一个值进行检测,看交换的动作是否在一个循环里面进行,如果一个内部循环完了没有交换,那么p不会赋值为0,就会在在这次循环结束跳出外部循环,提高效率。

另外:  

我们还有其他的优化空间,我们在从左往右找到最大值的同时也可以从右往左把最小值找到:

 这里我们可以再用一个if控制从右往左来寻找最小的

测试:

那么我们为了更加清楚的感受这三种版本冒泡排序的效率,我们借助clock并用多个数据来测试:

在这里用了动态数组和产生随机值来创造一个乱序数组,然后再用clock函数记录每个版本排序的时间:(这里忘记free三个数组了,但是结果没有影响 )

先考虑数据多的情况,以10 0000为例:

 

70000 为例:

50000为例:

20000为例:

10000:

5000:

出乎我们意料,第一次优化是负优化,因为提前结束的排序情况很少,但是一系列逻辑操作,变量赋值会消耗一定时间,前者减少的情况少,导致时间反而延长了。但是第二次优化是可以的,多少优化了一些。如果是平常小数据的排序直接最初的就行,第二次优化也没有多大的增益。所以我只能说快排是最快的!

祝大家龙年大吉,点点赞

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值