---
# System prepended metadata

title: 選擇排序 (Selection sort)

---

# 選擇排序 (Selection sort)

## 簡介

分成已排序和未排序的陣列，在未排序的陣列中搜尋出最小的數字，之後加入到已排序陣列的最後一位。

選擇排序法在使用**交換模式下**為**不穩定排序法**。
選擇排序法在使用**插入模式下**為**穩定排序法**。

## 舉例說明

假設使用選擇排序法將陣列中的值由小到大排序。

初始陣列為：[8,3,2,1,7,4,6,5]

那麼第一次排序時會由左至右在陣列中找到最小的值，並將之與第一個位置的值做交換，因此第一輪結束後的陣列為：[1,3,2,8,7,4,6,5]。

完整的排序結果如下圖所示：

![](https://i.imgur.com/6Djt5jk.png)

## 算法

1. 選擇排序一共有 n-1 輪排序。
2. 每一輪排序又是一個循環。

### 循環的規則

1. 先假定當前這個數是最小數，然後和後面的每個數進行比較。
2. 如果發現有比當前數更小的數，就重新確定最小數，並得到索引值。
3. 當遍歷到陣列的最後時，就得到本輪的最小值和對應的索引。
4. 將目前的數與最小值交換。

## 時間複雜度
假設今天要對一陣列使用選擇排序法由小到大排序。

### 最佳：O(n^2^)

### 平均：O(n^2^)

### 最差：O(n^2^)

無論資料順序如何，都會執行兩個迴圈。

## 參考資料
- [選擇排序法詳解](https://hackmd.io/@Aquamay/H1nxBOLcO/https%3A%2F%2Fhackmd.io%2F%40Aquamay%2FHy4Cwch9u)