天天看點

排序算法一:冒泡排序冒泡排序   

冒泡排序   

 冒泡排序(Bubble Sort)可以稱的上是最為經典的排序算法。它的思路比較簡單,即從後向前,逐個比較相鄰的兩項,尋找最優值(最大或最小),使得該值始終向着我們所需要的方向前進,直到最優值達到它的目的地為止。(為友善起見,我這裡統一都讨論順序排序——從小到大排序,即每一輪都尋找最小的元素放在隊列的前端位置。)第一輪比較即獲得最小的元素放在隊列的第一個位置,第二輪比較獲得除最小元素外的所剩餘的元素的最小值(即次小者)放在隊列的第二個位置,以此類推。

下面給出Java代碼

package sort.bubble;

public class BubbleSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//設定元素個數
		int count = 0;
		//獲得随機可重複元素組
		//int[] data = createData(count);
		//随機不可重複元素組
		int[] data = createNoRepeatData(count);
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i] + " ");
		}
		//冒泡排序
		bubbleSort(data);
		System.out.println("\r\n" + "=================");
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i] + " ");
		}

	}

	/**
	 * 冒泡算法
	 * @param data
	 * @return
	 */
	private static void bubbleSort(int[] data) {
		
		if (null == data || data.length <= 1) {
			return;
		}
		
		for (int i = 0; i < data.length; i++) {
			//從後向前,相鄰兩項進行比較
			for (int j = data.length-1; j > i; j--) {
				if(data[j-1]>data[j]){
					swap(data,j-1,j);
				}
			}
		}
	}

	/**
	 * 數組内 i 坐标元素與 j 坐标元素互換
	 * @param data
	 * @param i
	 * @param j
	 */
	private static void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;
		
	}

	/**
	 * 獲得随機不可重複數組
	 * @param data 
	 * @param count
	 * @return
	 */
	private static int[] createNoRepeatData(int count) {
		int[] data = new int[count];
		int randomNum = 0;
		boolean isExist = false;
		for (int i = 0; i < data.length; i++) {
			while (true) {
				randomNum = (int) Math.round(Math.random()*count);
				isExist = false;
				for (int j = 0; j < i; j++) {
					if (data[j] == randomNum) {
						isExist = true;
						break;
					}
				}
				if (!isExist) {
					data[i] = randomNum;
					break;
				}
			}			
		}
		
		return data;
	}

	/**
	 * 獲得随機可重複數組
	 * @param data 
	 * @param count
	 * @return
	 */
	private static int[] createData(int count) {
		int[] data = new int[count];
		for (int i = 0; i < data.length; i++) {
			data[i] = (int) Math.round(Math.random()*count);
		}
		return data;
	}

}