经典算法(7)- 冒泡排序(Bubble Sort)

冒泡排序的基本思想是每次在左边未排好序元素序列中依次挨个比较大小,如果相邻两个元素不是正确顺序(正确顺序为左边元素小于右边元素),交换该两 个元素。直到左边未排好序的元素中最大的元素进入(冒泡)右边已经排好序的元素中,并作为最小元素落在已经排好序的元素序列的最左端。总的比较操作次数 为:(n-1) + (n-2) + ... + (1)=n(n-1)/2; 最坏的情况总的交换次数等于总的比较操作次数, 比如输入的元素为从大到小顺序,需要每次比较(if(A[j-1]>A[j]))完之后做一次交换。

在下面的实现,考虑到每一次外层循环中,如果内层循环中没有发生任何交换(exchanged = false),说明左边的元素序列已经排好序,这时直接退出外层循环。例如在测试数据中,当i=5时,左边的元素序列为1,2,3,4,5,7,内层循环 接着比较5次,未发现元素交换次序,于是直接退出外层循环。

选择排序和冒泡排序比较:

1)选择排序中只需交换O(n)次,而冒泡排序可能需要交换O(n^2)次,效率很低;

2)但是和选择排序相比,冒泡排序的一个优点是,它是稳定的(stable),因为只交换相邻的元素,不像选择排序交换非相邻元素,选择排序是不稳定的(unstable)。

所以对于比较大的输入序列一般不要使用冒泡排序算法,可以用插入排序代替。

实现:

/**
 * 
 * @author ljs
 * 2011-05-31
 * 
 * Bubble Sort: O(n^2) 
 *
 */
public class BubbleSort {
	public static void solve(int[] A){
		int n = A.length;
	
		for(int i=n-1;i>=1;i--){
			
			boolean exchanged = false;
			for(int j=1;j<=i;j++){
				if(A[j-1]>A[j]){
					//swap
					int tmp = A[j-1];
					A[j-1] = A[j];
					A[j] = tmp;
					exchanged = true;
				}
			}
			if(!exchanged)
				break;			
		}
	}
	public static void main(String[] args) {
		int[] A= {1,3,10,9,2,7,19,5,20,4,8,11};
		BubbleSort.solve(A);
		for(int i=0;i<A.length;i++){
			System.out.format(" %d", A[i]);
		}		
	}
}

测试(输入序列: 1,3,10,9,2,7,19,5,20,4,8,11):
 1 2 3 4 5 7 8 9 10 11 19 20

posted @ 2011-06-05 22:32  ljsspace  阅读(334)  评论(0编辑  收藏  举报