首先我们要理解排序的定义:
冒泡排序(Bubble sort):相邻的两个数逐个的做比较,如果前一个数比后一个数小那么就交换过来,当第一轮比较完毕之后最小的值一定在末尾
我们可以先画出以一张图:
数组两个相邻的值去比较后面的数大于前面的数就会去交换,因此每轮比较后最小值都会出现在这次比较的最后一位
第二次比较:
第三次比较:
第四次比较:
好了,上面就是我们模拟计算机去比较一个数组;既然我们知道了如何去比较数组
那么我们该如何去编写代码,让计算机会自动去比较呢?
这就要发挥我们自己的创造能力以及独特的思维,言归正传,我们到底该如何写出这个冒泡排序呢?
接下来就由我就来简单的演示一下吧!
例子1:
这个就是最简单的交换方法
我们看到这个方法:
Q:第一个for循环为什么从1开始,以及为什么是这个循环条件?
A:从1开始是因为外层循环代表的是比较轮数,不可能有第0轮这个东西把
循环条件是由上面的表格观察而出来的,比较轮数是小于这个数组的长度的
Q:第二个for循环从为什么从0开始,以及这个循环条件
A:因为第二个循环代表的是每一轮比较的次数,从0开始是也代表要交换的索引
既然我们知道了这个循环代表的是比较次数,从上面的表格中可以得出这么一个结论
交换次数 = 数组长度 - 当前轮数
因为是从0开始的所以就要小于这个值,这就是我们的循环条件
最后if中的就好理解了加入后一个索引的数大于当前索引数,就去交换这两个数。
例子2:
利用求极值的思路去做冒泡排序
这是第一次写出的结果:
其实我们发现这个数组其实在第5行的时候就交换好了
可是程序并不会因此停下来,然后继续交换从而得到了意外的结果
那么怎么来判断这个数组是否已经排好序了,从而去停止整个循环
没错,就是然后判断数组是否从大到小排好序了呢?
这里我使用了一个方法:
我们来看到这个方法:
我们默认这个数组是循序排序的,所以结果为true
然后开始循环:
假如有前面索引的数小于后面索引数,就说明这个数组不是降序排列的
就把结果改为false,并且跳出循环
这就是我们判断数组是否降序排列的一个方法,
如果判断是否为升序排列的话,只需把if中的小于号换成大于号还即可
利用这个方法得出的结果是这样子的:
这就是我们所期望的结果。
接下来就是给出整个代码:
这里要说明一下:
ArrayDemo.printArray方法其实就是一个遍历数组的方法
为了节省时间就直接调用过来了
我们也可以把上面的冒泡排序优化一下,和例子2也是一样的思路
如图:
最后在看一下这两种方法的耗时:
差不多就是这样子了