1. 程式人生 > >Java排序演算法-氣泡排序以及優化

Java排序演算法-氣泡排序以及優化

繼上一篇博:

  氣泡排序:

如何理解:

 兩個數比較大小,較大的數下沉,較小的數冒起來。

 過程:

  • 比較相鄰的兩個資料,如果第二個數小,就交換位置。
  • 從後向前兩兩比較,一直到比較最前兩個資料。最終最小數被交換到起始的位置,這樣第一個最小數的位置就排好了。
  • 繼續重複上述過程,依次將第2.3...n-1個最小數排好位置。

 實現:

public static void BubbleSort(int [] arr){

     int temp;//臨時變數
     for(int i=0; i<arr.length-1; i++){   //表示趟數,一共arr.length-1次。
         for(int j=arr.length-1; j>i; j--){

             if(arr[j] < arr[j-1]){
                 temp = arr[j];
                 arr[j] = arr[j-1];
                 arr[j-1] = temp;
             }
         }
     }
 }
  • 針對問題:
    資料的順序排好之後,冒泡演算法仍然會繼續進行下一輪的比較,直到arr.length-1次,後面的比較沒有意義的。

  • 方案:
    設定標誌位flag,如果發生了交換flag設定為true;如果沒有交換就設定為false。
    這樣當一輪比較結束後如果flag仍為false,即:這一輪沒有發生交換,說明資料的順序已經排好,沒有必要繼續進行下去。

實現程式碼:

package com.temp;
/**
 *  氣泡排序
 * @author Mr.L
 *
 */
public class A {
	public static void BubbleSort1(int [] arr){

		   int temp;//臨時變數
		   boolean flag;//是否交換的標誌
		   for(int i=0; i<arr.length-1; i++){   //表示趟數,一共arr.length-1次。

		       flag = false;
		       for(int j=arr.length-1; j>i; j--){

		           if(arr[j] < arr[j-1]){
		               temp = arr[j];
		               arr[j] = arr[j-1];
		               arr[j-1] = temp;
		               flag = true;
		               
		           }
		       
		       }
		       if(!flag) break;
		       for (int k = 0; k <arr.length; k++) {
					System.out.println(arr[k]);
					
				} 
		   }
		 
		}
	public static void main(String[] args) {
		 // 建立arr  int 陣列 
		int [] arr= {1,3,2,5,6};
		// 呼叫
		BubbleSort1(arr);
	}
}

輸出如下:


歡迎各路大神指正錯誤,。