冒泡排序过程详解

冒泡排序

1,引入

  • 一种简单的排序算法

2,比较轮数 与 每轮的比较次数

  • 比如,我们要对64 34 25 72 22 11 60这个序列升序排序

  • 冒泡排序的思路是:将序列从左到右,每两个相邻的数都比较一次,如果前者大于后者,就交换这两个相邻数字的位置,这个过程重复多次,就可以将序列变成升序的。拿上面例子来说:
    第一轮交换过程

  • 想象一下,你走在回家的路上,沿途有各种价值不一的宝物,每次遇到宝物,你总会把手里的宝物和遇到的宝物比较,然后带走价值较大的那一个,当你回到家时,你带来的肯定是价值最大的那一个。这就是上面不断比较然后适时交换想达到的目的。

  • 所以第一轮后的必然结果是序列中的最大值被交换到序列最右端
    第一轮交换结果

  • 这表示我们第二轮只需要比较到倒数第二个位置,毕竟序列剩余的任何数都比最大值小,比较的结果也必然是不交换。

  • 也可以这样理解:第一轮过后,最大值已经被安排在了合适的位置,现在相当于是对前n-1个数组成的子序列排序。这种理解对以递归实现冒泡排序很有用。

  • 下面继续看第二轮:
    第二轮比较过程

  • 第二轮排序后的结果:
    第二轮交换结果

  • 第二轮过后,倒数第二大的数字64被交换到了倒数第二个位置上,同样下一轮中我们只比较到倒数第三个位置即可。

  • 所以每轮比较的次数都比前一轮少1

  • 另一个问题是:要使整个序列有序最少需要比较多少轮?

  • 每轮过后都会将一个当前最大值放到序列右端,n-1轮后,剩余的最后一个元素相当于自己组成序列的最大值,无需比较,自然有序,所以最少需要的比较轮数是n-1n是元素总数)
    剩余几轮比较过程

3,实现

3,1, C++代码
  • C++实现:
// bubble_sort.cc
void bubble_sort(vector<int>& seq) {
   
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值