冒泡排序算法

package com.sort;

/**
 * 冒泡排序算法
 * 比較相鄰的元素,若是第一個比第二個大,就交換它們。
 * 對每一對相鄰元素作一樣的工做,從開始的第一對到結尾的最後一對,在這一點上,最後元素是最大的數。
 * 針對全部的元素重複以上的動做,除了最後一個元素。
 * 持續每次對愈來愈少的元素重複上面的動做,直到沒有任何一對元素須要比較。
 * 
 *  時間複雜度
 * 平均狀況:O(n2), 最好狀況:O(n), 最壞狀況:O(n2)
 * 
 * 空間複雜度
 * 輔助存儲:O(1)
 * 
 * 穩定性:穩定
 */

public class BubbleSort{
	
	/**
	 * 
	* @Title: sort 
	* @Description: 假設數組長度爲n,每完成一次大循環將最小的冒泡到上端,要完成全部元素排序,須要通過n次大循環,
	* 				小循環進行兩兩相鄰元素對比,若是反序則交換位置,小循環從最後開始比較,次數逐次遞減,
	* 				加入flag布爾變量改進冒泡算法,使其對有序數組的排序時間複雜度變爲O(n)。
	*/
	public static void sort(Comparable[] a) {
		int compareNum = 0;
		int swapNum = 0;
		int size = a.length;
		boolean flag = true;
		
		for(int i=0; i<size && flag; i++) {      
			flag = false;
			for(int j=size-1; j>i; j--) {  
				System.out.println("compare num:" + (++compareNum));
				if(less(a[j], a[j-1])) {
					swap(a, j, j-1);
					flag = true;
					System.out.println("swap num:" + (++swapNum));
				}
			}
		}
	}
	
	public static void show(Comparable[] a) {
		for(int i=0; i<a.length; i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println();
	}
	
	private static boolean less(Comparable v, Comparable w) {
		return v.compareTo(w) < 0;
	}
	
	private static  void swap(Comparable[] a, int i, int j) {
		Comparable t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
	
	public static void main(String[] args) {
		Integer a[] = {23, 44, 56, 91, 2, 0, 81,100, 3, 17};  
		Integer b[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
		
		//無序數組排序
		sort(a);
		show(a);
		
		//有序數組排序
		sort(b);
		show(b);
	}
}
相關文章
相關標籤/搜索