選擇排序 【SelectionSort】

選擇排序

假設初始的數組是[5,4,7,2] 以從小到大排序爲例,我們可以將數組分爲兩個區域,一個是無序區,一個是有序區,在一開始所有的數據都在無序區。

  1. 進行第一輪排序,對無序區的數組[5,4,7,2]進行遍歷,記錄最小值2,然後將它與第0個元素進行位置交換。此時無序數組[4,7,5],有序數組[1],原本的數組[1,4,7,5]
  2. 進行第二輪排序,對無序區的數組[4,7,5]進行遍歷,記錄最小值4,然後將它與第1個元素進行位置交換。當然自己本身就處於第一個元素的位置,所以可以不變,此時無序區數組[7,5] ,有序數組[1,4],原本的數組[1,4,7,5]
  3. 進行第三輪排序,對無序區數組[7,5]進行遍歷,記錄最小值5,然後將它與第2個元素進行位置交換。此時數組[2,4,,5,7]

總結:
1. 每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置
2. 重複一過程

算法實現

public class SelecitionSort {

    public void selectionSort(int[] arr) {
        if(arr == null || arr.length == 1) {
            return ;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                minIndex = arr[j] < arr[minIndex] ? j : minIndex;
            }
            swap(arr, i, minIndex);
        }
    }

    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp; 
    }
}

時間複雜度

需要進行n-1次排序(n爲數組長度),每一次排序需要進行n-i次比較(i爲當前第幾次排序)。所以時間複雜度爲 O(N^2)

即使考慮了初始化數據的情況,時間複雜度也是O(N^2), 只是需要交換的次數爲0,最壞的情況會交換n-1次。

穩定性

選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裏面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因爲只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章