冒泡排序基本思想: 冒泡顾名思义,类似于小水泡从小变大的过程,类比一下就是每次把最大的数选择出来,当然了换成代码每次可以把最大的或者最小的选择出来,我们假设按照从小到大排序,那么第一次最大的就会到数组末尾,以此类推,排序就完成了
直接上图:
带排序数组我们假设:{9,6,1,3,5}
代码比较简单,直接搞:
可能会有疑问,就这么点代码为什么写这么多方法?
确实代码很简单,当然可以写到一起了,但是Java是面向对象的啊,假如对面向对象理解的不够,这样想,main方法就是个调度者,真正会排序的、会交换、会打印的是不是有专门人要做,main方法只需要调度就行了,代码少看不出来,一个方法代码量一上200行,其实200都有点多,主方法其实只需要包含主要逻辑就行,细节调用具体的方法,这样业务逻辑清晰也方便复用,如果还是一个方法从头写到尾,这哥们估计还需要大大提高。
说下冒泡时间复杂度、空间复杂度
空间复杂度如果你看了选择排序那一篇,就很简单了:O(1)
时间复杂度类似:O(n2) 即n的平方
如果你平时关注过,应该还会见过冒泡最好情况下时间复杂度:O(n) 最坏情况下时间复杂度:O(n2)
What? 最好是O(n),看上面代码不可能啊,怎么会是O(n)!
其实是因为上面的算法没有优化,注意关键词“最好情况下”,下面开始优化:
优化1:
假如我们之前前几次的遍历就没有再交换过元素,说明已经有序了,是不是之后的循环就可以不再继续了,按照这个思路:
这样最好情况下(指的是待排序数组本身就是有序)时间复杂度就是O(n)了
思考:1.还能不能优化?其实还可以再优化,可以试试看
2.选择排序最好最好情况下可以是O(n)吗?
下篇:插入排序