1. 程式人生 > >【資料結構與演算法】------氣泡排序

【資料結構與演算法】------氣泡排序

 學習開發一年的時間裡,很少去了解排序演算法,氣泡排序也是最開始學習的樣子,靠死記硬背,沒有引入自己的理解。

 對於什麼時間複雜度和空間複雜度和穩定性也不清楚其原委,或許在程式碼方面少了幾許的天分:

氣泡排序:

氣泡排序每一輪的比較都是前面的數和後面的數進行比較,並交換位置,每一輪結束,最大值就位於序列末尾。

下面程式碼是最初的氣泡排序程式碼:

public class bubbleSort {
      public static void sort(int[] arr) {
    	   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]) {
    			    	int num = arr[j];
    			    	arr[j]=arr[j+1];
    			    	arr[j+1]=num;
    			    	
    			    }
    		   }
    	   }
      }
     public static void main(String[] args) {
		 int[]  arr = {20,40,30,10,60,50};
		 sort(arr);
		 for(int i=0;i<arr.length;i++) {
			 System.out.println(arr[i]);
		 }
	}
}

  因為氣泡排序,是前後兩個數進行比較,即使一個序列後半部分是一個有序的序列,氣泡排序還是挨個進行比較這樣就比較浪費時間。 通過新增一個識別符號,如果有一輪比較,識別符號沒有改變,就結束迴圈。

程式碼如下:

public class bubbleSort {
    public static void main(String[] args) {
        int[] arr = {49,38,65,97,76,27,49};
        bubbleSort(arr);
        for(int i = 0;i < arr.length;i++){
            System.out.println(arr[i]);
        }
    }
       public static void bubbleSort(int[] arr){
        boolean flag;//
            for(int i = arr.length-1; i > 0; i--){
                flag = false; 
                for(int j = 0; j < i; j++){
                    if(arr[j] > arr[j+1]){
                        swap(arr,j,j+1);
                        flag = true;
                    }
                }
                if(!flag){
                    return;
                }
            }
       }
       public static void swap(int[] arr,int m,int n){
           int num = arr[m];
           arr[m] = arr[n];
           arr[n] = num;
       }
}

    氣泡排序是穩定的,因為當a = b時,只有大於才進行位置的交換,故 a 和 b 的位置沒有計劃進行交換,所以演算法穩定。