1. 程式人生 > >選擇排序 【SelectionSort】

選擇排序 【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的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序演算法。