数组的冒泡排序

首先我们要理解排序的定义:

冒泡排序(Bubble sort):相邻的两个数逐个的做比较,如果前一个数比后一个数小那么就交换过来,当第一轮比较完毕之后最小的值一定在末尾

我们可以先画出以一张图:

数组两个相邻的值去比较后面的数大于前面的数就会去交换,因此每轮比较后最小值都会出现在这次比较的最后一位

第二次比较:

第三次比较:

第四次比较:

 

好了,上面就是我们模拟计算机去比较一个数组;既然我们知道了如何去比较数组

那么我们该如何去编写代码,让计算机会自动去比较呢?

这就要发挥我们自己的创造能力以及独特的思维,言归正传,我们到底该如何写出这个冒泡排序呢?

接下来就由我就来简单的演示一下吧!

例子1:

 

这个就是最简单的交换方法

我们看到这个方法:

Q:第一个for循环为什么从1开始,以及为什么是这个循环条件?

A:从1开始是因为外层循环代表的是比较轮数,不可能有第0轮这个东西把

    循环条件是由上面的表格观察而出来的,比较轮数是小于这个数组的长度的

Q:第二个for循环从为什么从0开始,以及这个循环条件

A:因为第二个循环代表的是每一轮比较的次数,从0开始是也代表要交换的索引

     既然我们知道了这个循环代表的是比较次数,从上面的表格中可以得出这么一个结论

    交换次数  = 数组长度 - 当前轮数

   因为是从0开始的所以就要小于这个值,这就是我们的循环条件

最后if中的就好理解了加入后一个索引的数大于当前索引数,就去交换这两个数。

 

 

 例子2:

利用求极值的思路去做冒泡排序

 这是第一次写出的结果:

其实我们发现这个数组其实在第5行的时候就交换好了

可是程序并不会因此停下来,然后继续交换从而得到了意外的结果

那么怎么来判断这个数组是否已经排好序了,从而去停止整个循环

没错,就是然后判断数组是否从大到小排好序了呢?

这里我使用了一个方法:

 

我们来看到这个方法:

 

我们默认这个数组是循序排序的,所以结果为true

然后开始循环:

假如有前面索引的数小于后面索引数,就说明这个数组不是降序排列的

就把结果改为false,并且跳出循环

这就是我们判断数组是否降序排列的一个方法,

如果判断是否为升序排列的话,只需把if中的小于号换成大于号还即可

 利用这个方法得出的结果是这样子的:

这就是我们所期望的结果。

接下来就是给出整个代码:

 

这里要说明一下:

ArrayDemo.printArray方法其实就是一个遍历数组的方法

为了节省时间就直接调用过来了

 

我们也可以把上面的冒泡排序优化一下,和例子2也是一样的思路

如图:

 

 

最后在看一下这两种方法的耗时:

 

差不多就是这样子了

 

posted @ 2018-10-26 22:50  JAV不会A  阅读(2032)  评论(0编辑  收藏  举报