1,原理
相邻元素两两比较,大的往后放(以从小到大排序为例)。第一次完毕后,最大值就出现在了最大索引处。也就是说,冒泡排序每经过一次,至少有一个元素处于最终位置。同理,继续循环,即可得到一个排序好的数组。冒泡排序次数是数组长度-1次。
2,源码
源码一:标准代码
package cn.itcast_03; public class ArrayBubble { public static void main(String[] args) { int[] arry = {21,18,36,14,48,30,65,53}; System.out.println("排序前:"); arryTraversal(arry); System.out.println("排序后:"); arryBubble(arry); arryTraversal(arry); } //遍历数组 public static void arryTraversal(int[] arry) { String s = ""; for(int i = 0; i < arry.length; i++) { if(i == 0) { s = "[" + arry[i]; }else { s += "," + arry[i]; } } System.out.println(s + "]"); } //冒泡排序方法 public static void arryBubble(int[] arry) { for(int x = 0;x < arry.length - 1;x++) { //共比较arry.length - 1次 for(int y = 0;y < arry.length - x - 1; y++) { //arry.length-x的原因:每经过一次比较后,最大索引处的元素已确定完毕,不需要再比较 if(arry[y] > arry[y+1]) { //所以-x可以降低比较次数,提高算法的效率 int temp = arry[y]; //用临时变量temp存储待交换的值 arry[y] = arry[y+1]; arry[y+1] = temp; } } } } }
源码二:改进版(本段代码只包含冒泡排序方法本身代码,将该方法替换源码一中的“冒泡排序方法”即可使用,也可单独复制调用)
//改进后的冒泡排序方法 public static void arryBubbleNew(int[] arry) { boolean flag = false; for(int x = 0;x < arry.length - 1;x++) { //共比较arry.length - 1次 for(int y = 0;y < arry.length - x - 1; y++) { //arry.length-x的原因:每经过一次比较后,最大索引处的元素已确定完毕,不需要再比较 if(arry[y] > arry[y+1]) { //所以-x可以降低比较次数,提高算法的效率 int temp = arry[y]; //用临时变量temp存储待交换的值 arry[y] = arry[y+1]; arry[y+1] = temp; flag = true;//只要顺序有发生改变的,就更改flag标志 } } if(flag == false) break; //如果某次循环,flag标志没有改变, } //也就是说数组已经排好序了,不用再继续循环排序了,提高了冒泡排序的效率 }