槓上數據結構 - 排序

槓上數據結構 - 排序

在這裏插入圖片描述
在這裏插入圖片描述

  • 穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面。
  • 不穩定:如果a原本在b的前面,而a=b,排序之後 a 可能會出現在 b 的後面。
  • 時間複雜度:對排序數據的總的操作次數。反映當n變化時,操作次數呈現什麼規律。
  • 空間複雜度:是指算法在計算機

冒泡排序

每次 比較相鄰 的兩個元素,後一個元素值小於前一個元素值(升序),則交互位置,n 個元素需要比較 n-1 趟,每一趟需要比較 (n-當前第幾趟) 次。
如數組 {23, 1, 98,4,18,3 }

第一趟:
第一次比較:23 > 1 交換位置: 1, 23, 98, 4, 18, 3
第二次比較:23 < 98 位置不變: 1, 23, 98, 4, 18, 3
第三次比較:98 > 4 交換位置: 1, 23, 4, 98,18, 3
第四次比較:98 > 18 交換位置: 1, 23, 4,18, 98,3
第五次比較:98 > 3 交換位置: 1, 23, 4,18, 3,98
第一趟比較完,最大的元素下移到最後位置。

第二趟:
第一次比較:1 < 23 位置不變: 1, 23, 4,18, 3,98
第二次比較:23 > 4 交換位置: 1, 4,23, 18, 3,98
第三次比較:23 > 18 交換位置: 1, 4, 18,23, 3,98
第四次比較:23 > 3 交換位置: 1, 4, 18,3, 2398
第二趟比較完,最大的兩個元素排到了最後兩個位置上了。

第三趟:
第一次比較:1 < 4 位置不變: 1, 4, 18,3, 2398
第二次比較:4 > 18 位置不變: 1, 4, 18,3, 2398
第三次比較:18 > 3 交換位置: 1, 4, 3,18, 2398
第三趟比較完,最大的三個元素排到了最後三個位置上了。

第四趟:
第一次比較:1 < 4 位置不變: 1, 4, 3,18, 2398
第二次比較:4 > 3 交換位置: 1, 3, 418, 2398
第四趟比較完,最大的四個元素排到了最後四個位置上了。

第五趟:
第一次比較:1 < 3 位置不變:1, 3, 418, 2398
第五趟比較完,最大的五個元素排到了最後五個位置上了。

常規寫法

private void bubbleSort(int[] array) {
        for(int i = 0; i < array.length - 1; i++) {
            System.out.println("第 " + i + " 趟");
            for(int j = 0; j < array.length - i - 1;j++) {
                if(array[j] > array[j+1]) {
                    int temp = array[j+1];
                    array[j+1] = array[j];
                    array[j] = temp;
                }
            }
        }
        print(array);
    }
    
bubbleSort(new int[]{1,2,3,4,5,6,9,8});    
"第 0 趟" : 
"第 1 趟" : 
"第 2 趟" : 
"第 3 趟" : 
"第 4 趟" : 
"第 5 趟" : 
"第 6 趟" : 
[1, 2, 3, 4, 5, 6, 8, 9]

優化一: 標誌位減少比較趟數

條件: 假如有序列 {1, 2, 3, 4, 5, 6, 7, 8, 10, 9} , 第一趟排序將 10 和 9 交換位置,此時序列爲 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 已經有序,接下來的 8 趟排序就是多餘的,什麼也沒做。所以我們可以加一個標誌位,如果某一趟中沒有交換過元素,則說明此時已經有序了,不用再比較剩下的趟數。

private void bubbleSort(int[] array) {
        for(int i = 0; i < array.length - 1; i++) {
            System.out.println("第 : "  + i  + " 趟 ");
            // 標記這一趟中,有沒有元素交換位置,如果這一趟中沒有元素交換位置,則說明此時已經有序了,後面的 n-i-1 趟就不需要再走了。
           boolean changed = false;
            for(int j = 0; j < array.length - i - 1;j++) {
                if(array[j] > array[j+1]) {
                    int temp = array[j+1];
                    array[j+1] = array[j];
                    array[j] = temp;
                    changed = true;
                }
            }
            if(!changed) {
                break;
            }
        }
        print(array);
    }
    // 調用
   bubbleSort(new int[]{1,2,3,4,5,6,9,8});             
            
第 0 趟
第 1 趟
[1, 2, 3, 4, 5, 6, 8, 9]

選擇排序

private void sortSelect(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        int min = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        if (min != i) {
            int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
    System.out.println(Arrays.toString(arr));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章