冒泡排序及其優化

原理:比較兩個相鄰的元素,將值大的元素交換至右端。

思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至全部排序完成。

第一趟比較完成後,最後一個數一定是數組中最大的一個數,所以第二趟比較的時候最後一個數不參與比較;

第二趟比較完成後,倒數第二個數也一定是數組中第二大的數,所以第三趟比較的時候最後兩個數不參與比較;

依次類推,每一趟比較次數-1;
在這裏插入圖片描述
……
在這裏插入圖片描述

排序優化:

出現的問題也來源於兩次無腦的循環,正是因爲循環不顧一切的向下執行,所以會導致在一些特殊情況下得多餘。例如 5,4,3,1,2 的情況下,常規版會進行四次循環,但實際上第一次就已經完成排序了。

/*
* 優化:
* 因爲排序過程中,各元素不斷接近自己的位置,如果一趟下來沒有進行交換,就說明排序完成
* 因此 在排序過程中,設置一個flag來判斷元素是否交換,,從而減少不必要的比較
*
* */

package sort;

public class 冒泡排序 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int arr[]={-1,3,9,8,-2};
		/*數組:arr[]={-1,3,9,8,-2}
		 * 有五個元素,需要進行四次 大的比較 來確定 出最大值 ,最後一個值自然就不用比較了
		 * 第一次比較: 確定出最大值爲 :9 確定過程需要 兩兩比較  比較四次
		 * 第二次比較: 確定出最大值爲 :8 確定過程需要 兩兩比較  比較三次
		 * 第三次比較: 確定出最大值爲 :3 確定過程需要 兩兩比較  比較兩次
		 * 第四次比較: 確定出最大值爲 :-1 確定過程需要 兩兩比較  比較一次
		 * 
		 * */
		int temp=0;
		boolean flag=false;
		for (int i = 0; i < arr.length-1; i++) {
			for (int j = 0; j < arr.length-1-i; j++) {
				if(arr[j]>arr[j+1]){
					flag = true;//
					temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
			/*
			 * 優化:
			 * 因爲排序過程中,各元素不斷接近自己的位置,如果一趟下來沒有進行交換,就說明排序完成
			 * 因此 在排序過程中,設置一個flag來判斷元素是否交換,,從而減少不必要的比較
			 * 
			 * */
			if(!flag){
				break;
			}else{
				flag=false;
			}
			System.out.println("第"+(i+1)+"次排序");
			toArray(arr);
		}
		
	}
//輸出數組
	public static void  toArray(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+" ");
			
		}	
		System.out.println("=======");
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章