數據結構與算法系列——排序(5)_簡單選擇排序

1. 工做原理(定義)

  選擇排序(Selection sort)是一種簡單直觀的排序算法。它在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小(大)元素,而後放到已排序序列的末尾。以此類推,直到全部元素均排序完畢。html

2. 算法步驟

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  2. 再從剩餘未排序元素中繼續尋找最小(大)元素,而後放到已排序序列的末尾。
  3. 重複第二步,直到全部元素均排序完畢。

  

 

3. 動畫演示

4. 性能分析

1. 時間複雜度

  選擇排序的比較次數爲 n(n-1)/2,比較次數O(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數N=(n-1)+(n-2)+...+1=n*(n-1)/2。git

  交換次數介於0和(n-1)次之間,交換次數O(n)。最好狀況是,已經有序,交換0次;最壞狀況交換n-1次,逆序交換n/2次。github

  賦值操做介於 0 和 3 (n - 1) 次之間。算法

  故而在最優、最壞和平均狀況下,其時間複雜度爲 O(n^2)。數據結構

2. 空間複雜度

  選擇排序過程當中,須要臨時變量存儲待排序元素,所以空間複雜度爲O(1)。性能

3. 算法穩定性 

  選擇排序是不穩定的算法,在選擇數值和交換過程當中它們的順序可能會發生變化。學習

4. 初始順序狀態

  1. 比較次數:
  2. 移動次數:
  3. 複雜度:    
  4. 排序趟數:無關

5. 歸位

  能歸位,每一趟排序有一個元素歸位。動畫

6. 優勢

  1. 相對於冒泡排序更快。
  2. 交換次數比冒泡排序少多了,因爲交換所需CPU時間比比較所需的CPU時間多,n值較小時,選擇排序比冒泡排序快。
  3. 數據規模越小越好。

6. 具體代碼

public int[] selectionSort(int[] sourceArray){ int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); // 總共要通過 N-1 輪比較
    for (int i = 0; i < arr.length - 1; i++) { int min = i; // 每輪須要比較的次數 N-i
        for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { // 記錄目前能找到的最小值元素的下標
                min = j; } } // 將找到的最小值和i位置所在的值進行交換
        if (i != min) { int tmp = arr[i]; arr[i] = arr[min]; arr[min] = tmp; /* 另外一種交換方法 arr[min] = arr[min]^arr[i]; arr[i] = arr[min]^arr[i]; arr[min] = arr[min]^arr[i]; */ } } return arr; }

7. 參考網址

  1. 數據結構基礎學習筆記目錄
  2. 排序算法系列之選擇排序
  3. https://visualgo.net/en/sorting
  4. https://www.runoob.com/w3cnote/selection-sort.html
  5. https://github.com/hustcc/JS-Sorting-Algorithm
相關文章
相關標籤/搜索