排序算法-冒泡排序(優化)

排序算法在編程中起到非常大的作用,冒泡排序是其中比較經典的算法。雖然效率不高,但是每個算法都有適合的場景。冒泡排序就是在排序過程中相鄰元素不斷交換,看起來向元素冒泡一樣。那我們就可以通過添加一個標誌位來對冒泡排序進行優化處理。因爲,在某一次排序的過程中可能需要排序的數組已經是有序的了,在這個時候我們就可以通過標誌位判斷直接跳出循環。

冒泡排序:
時間複雜度是O(n2)
最好情況O(n)
最壞情況O(n2)
空間複雜度 O(1)

排序方式不佔用額外內存,冒泡算法是穩定的。在這有些剛剛接觸排序算法的朋友可能不知道穩定的意思,我就簡單的給大家解釋一下。比如說:在int [] arr = {1,2,5,1}數組中,經過排序後原來兩個1的順序沒有發生變化 。int[] arr={1,1,2,5}第一個1還是在第二個1的前面,就是穩定的,反之就是不穩定的。

以從小到大爲例展示冒泡排序過程
在這裏插入圖片描述
圖中紅色的數字,表示已經確定大小不需要在進行排序的數字。看到這大家應該可明顯的看出可以優化的地方,明明在第三趟排序的時候已經整個數組已經排好序了,但是還是會一直執行到第四趟結束。
從上圖我們還可以發現,冒泡排序一共需要進行排序個數 -1次排序,而且每一趟排序的次數在逐漸減少。

核心代碼

public static void bubbleSort(int[] arr){
        //臨時變量
        int temp = 0;
        //標誌位
        boolean flag = false;
        //第一個for循環表示排序的次數
       for (int i = 0; i < arr.length -1; i++) {
           //第二個for循環表示 數組內元素需要排序的次數
           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;
            }
           }
           if (!flag){
               break;
           }else {
               //重置標誌位
               flag = false;
           }
       }
   }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章