排序算法总结之冒泡排序

排序的方法很多,但每种算法都有自己的特点。本文总结了排序算法,排序算法最坏情况循环n *n 次,所以时间复杂度为O(n^2),而且算法稳定,易懂是该算法的特点

冒泡排序:
冒泡排序易于理解和接收,它是通过随机给定一个数组,然后让下标i和j分别指向array[0]和array[1]。比较array[j]和array[j-1],如果array[j-1]>array[j],则互换并且j++。比较完一轮后i++。直到i <=n-1。

手动步骤:
eg:1 4 7 89 67 21
第一轮(i = 0):
1 4 7 89 67 21
j = 1, array[j-1]>array[j]不成立,不互换,j+1

1 4 7 89 67 21
j = 2,array[j-1]>array[j]不成立,不互换,j+1

1 4 7 89 67 21
j = 3,array[j-1]>array[j]不成立, 不互换,j+1

1 4 7 89 67 21
j = 4,array[j-1]>array[j]成立,互换,j+1

1 4 7 67 89 21
j = 5,array[j-1]>array[j]成立,互换,j+1

1 4 7 67 21 89
j = 6,j=n-i成立,i +1,j=1

第二轮(i = 1):
1 4 7 67 21 89
j = 1,array[j-1]>array[j]不成立,不交换,j+1

1 4 7 67 21 89
j = 2,array[j-1]>array[j]不成立,不交换,j+1

1 4 7 67 21 89
j = 3,array[j-1]>array[j]不成立,不交换,j+1

1 4 7 67 21 89
j = 4,array[j-1]>array[j]成立,交换,j+1

1 4 7 21 67 89
j = 5,j = n-i成立,i+1,j+1

第三轮(i = 5):

……….

第n-1轮(i = 6)。

冒泡排序程序代码:
这里写图片描述

验证代码(主函数):
这里写图片描述
这里写图片描述

冒泡程序的优化:

优化方案1:

上述冒泡程序并不是最简洁的,如果i还没循环到length-1时就排好序了,i并不会停止,会继续增加循环。所以,上述的冒泡算法可以更优化。

设置一个flag状态量。用来记录本轮循环中是否有交换,如果有交换则值为1,否则置为0.为1时i继续增加,如果为0,则跳出循环。优化后的程序如下:
这里写图片描述

优化方案2:

第一种优化方案相对于最基本的冒泡排序相比更为简洁,但是在这个方案的基础上可以再进一步改进。设置一个变量first_swap 用来存放每一轮中第一次交换内容的下标值j。下一轮循环中,j直接从下标first_swap开始查询。如果本轮中没有进行交换则排序完成。具体程序如下:
这里写图片描述

这两种优化时间复杂度还是O(n^2),但是循环次数减少了,达到了一定的优化效果,可以通过更改主函数程序中使用的冒泡程序,来比较同样多数据用不同方案时间所用的时间。可能值还不是最好的优化,还有待大家继续努力,写出更好的优化方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值