冒泡排序算法是全部排序算法中最简单、最基础的一种。冒泡排序算法的思路就是交换排序,经过相邻数据的交换来达到排序的目的。java
冒泡排序算法经过屡次比较和交换来实现排序,其排序流程以下:算法
为了更好的理解冒泡排序算法的执行过程,下面举一个实际的例子来一步一步的执行冒泡排序算法。对于6个整形数据5二、2三、1八、8四、5八、11,这是一组无序的数据。对齐执行排序效果以下所示。数组
从上面的例子能够很是直观地了解到冒泡排序算法执行过程。整个排序过程就像水泡的浮起过程,故此而得名。冒泡排序算法在对n个数据进行排序時,不管原数据有无序,都须要进行n-1步的中间排序。这种排序方法思路简单直观,可是缺点是执行的步骤稍长,效率不高。spa
一种改进的方式,即在每次中间排序以后,比较一下数据是否已经按照顺序排列完成,不然继续进行冒泡排序。这样能够加速算法的执行过程。code
根据上面的基本的思想,咱们来动手写一个例子说明冒泡排序在排序中的应用。排序
package Bubble; public class BubbleAlgorithm { public static void bunnle(int[] a){ int temp; for (int i = 1; i < a.length; i++) { for (int j = 0; j < a.length-1; j++) { if (a[j] > a[j+1]){ temp = a[j]; a[j] = a[j+1]; a[j] = temp; } } System.out.print("第"+i+"步排序结果:"); for (int k = 0; k < a.length; k++) { System.out.print(" "+a[k]); } System.out.println("\n"); } } public static void main(String[] args) { int[] aa = {196,182,123,104,111,106,185,194,192,159}; System.out.print(" 初始值:"); for (int i = 0; i < aa.length ; i++) { System.out.print(" "+aa[i]); } System.out.println("\n"); bunnle(aa); } }
运行结果以下:it
初始值: 196 182 123 104 111 106 185 194 192 159 第1步排序结果: 182 123 104 111 106 185 194 192 159 196 第2步排序结果: 123 104 111 106 182 185 192 159 194 196 第3步排序结果: 104 111 106 123 182 185 159 192 194 196 第4步排序结果: 104 106 111 123 182 159 185 192 194 196 第5步排序结果: 104 106 111 123 159 182 185 192 194 196 第6步排序结果: 104 106 111 123 159 182 185 192 194 196 第7步排序结果: 104 106 111 123 159 182 185 192 194 196 第8步排序结果: 104 106 111 123 159 182 185 192 194 196 第9步排序结果: 104 106 111 123 159 182 185 192 194 196
图中显示了每一步排序的中间结果。从中能够看出第5步以后便已经完成对数据的排序,可是算法仍然须要进行后续的比较步骤。根据上面介绍的思路,加入判断部分,使之可以尽早结束排序过程,从而提升程序的执行效率。调优方法以下:class
package Bubble; public class BubbleAlgorithm { public static void bunnle(int[] a){ int temp; //定义 int fay = 0; for (int i = 1; i < a.length; i++) { for (int j = 0; j < a.length-1; j++) { if (a[j] > a[j+1]){ temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } System.out.print("第"+i+"步排序结果:"); for (int k = 0; k < a.length; k++) { //开始 if (a.length-2 >= k){ if (a[k]>a[k+1]){ fay = 1; } } //结束 System.out.print(" "+a[k]); } //开始 if (fay == 0){ break; }else { fay = 0; } //结束 System.out.println("\n"); } } public static void main(String[] args) { int[] aa = {196,182,123,104,111,106,185,194,192,159}; System.out.print(" 初始值:"); for (int i = 0; i < aa.length ; i++) { System.out.print(" "+aa[i]); } System.out.println("\n"); bunnle(aa); } }
输出结果以下:效率
初始值: 196 182 123 104 111 106 185 194 192 159 第1步排序结果: 182 123 104 111 106 185 194 192 159 196 第2步排序结果: 123 104 111 106 182 185 192 159 194 196 第3步排序结果: 104 111 106 123 182 185 159 192 194 196 第4步排序结果: 104 106 111 123 182 159 185 192 194 196 第5步排序结果: 104 106 111 123 159 182 185 192 194 196