
4.3.1 数组元素排序
对数组中的数据进行排序的算法有很多种,对于初学者而言,“冒泡排序”是最简单易懂的方法。冒泡排序的核心特点,就是先比较相邻两个元素的大小,然后根据排序规则进行换位。
如图4.7所示,是对一维数组中的5个数字56、32、8、76、12进行冒泡排序,要求排序之后,数组中的数据按照从小到大的次序排列。

图4.7 冒泡排序
图4.7中,在开始排序时,5个数字没有按从小到大的次序进行排列。接着开始进行第1轮排序,排序时依次对相邻的两个数字比较大小,如果前面的数字大于后面的数字,则将这两个数字交换位置,否则就不进行换位。参与排序的5个数字全都比较一遍并做了相应的换位之后,数值最大的76排在了最后的位置上,这个数字不再参与下一轮的比较。第1轮排序一共进行了4次比较和换位。在第2轮排序时,排除了上一轮的最大值76后,只需要对4个数字进行排序。排序的过程依旧是比较和换位。最终经过3次比较,找到了本轮的最大值56。第3轮排序时,将前两轮的最大值72和56排除掉,只需要对剩下的3个数字进行排序。最终经过2次比较和换位,找到了本轮的最大值32。第4轮排序时,将前3轮的最大值72、56、32排除掉,只需要对剩下的2个数字进行排序,最终经过1次比较找到了本轮的最大值12。经过4轮排序,5个数字实现了从小到大的排列。
通过上面的排序过程可以发现,排序的轮数等于参与排序的数字的个数减1。而每一轮排序的次数等于本轮参与排序的数字个数减1。这是因为每一轮排序都会找到本轮的最大值,而在下一轮排序时这个最大值不再参与比较,所以随着排序轮数的增加,参与比较的数字个数在减少,这是冒泡排序的一个基本规律。
在了解了冒泡排序的基本原理后,下面用代码实现冒泡排序的过程,如例4-8所示。
【例4-8】 Demo0408.java

程序的运行结果如下:
=========排序前=========== 56 32 8 76 12 =========排序后=========== 8 12 32 56 76
例4-8中,先定义了一个整型一维数组,存储了要排序的5个数字。接着使用循环将排序前的这5个数字打印输出,用于和排序后的结果做对比。然后,使用嵌套的for循环实现冒泡排序的算法过程。在嵌套for循环中,外层循环用于控制排序比较的轮数,内层循环用于控制每轮排序比较的次数。在内层循环中,每次做比较时,如果参与比较的两个元素,前面的元素比后面的元素大,则要进行换位。换位的时候,先定义一个临时变量,用于存储参与比较的前面的数组元素,接着把后面的元素存入前面的元素中,最后再把临时变量存储的数据存入后面数组元素中,从而完成元素换位。嵌套循环执行完成之后,数组元素就完成了排序过程。最后,使用循环输出排序后的数组数据。
编程技巧:对于初学者而言,冒泡排序的算法代码不太容易掌握。大家只要记住下面四句话,那么冒泡排序就很容易写出来:N元数组冒泡序,两两相比小前移。外层循环从1始,内层循环减i去。