原理:比較兩個相鄰的元素,將值大的元素交換至右端。
思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第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("=======");
}
}