排序算法——冒泡排序(原理+源码)

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标志没有改变,
		}                               //也就是说数组已经排好序了,不用再继续循环排序了,提高了冒泡排序的效率
	}
	







猜你喜欢

转载自blog.csdn.net/manduner/article/details/79470212