# Selection Sort 選擇排序法 ###### tags: `LeetCode` `sort` `selection sort` :::info :pushpin: 選擇排序法的概念是,將陣列分為兩個部分,每次掃描未排序的部分時,從數列中拿出最小的數,丟到另一邊,最後就會得到一個完成排序的陣列。它的時間複雜度是 $O(n^2)$。 ::: --- {%youtube xWBP4lzkoyM %} ## 一、步驟觀察 * 將陣列視為已排序(標記)、未排序兩個部分 * 遍歷未排序的陣列 * 從未排序的陣列中,取出最小值 * 與第一個值替換位置 * 向右移動標記 ![](https://i.imgur.com/wrGDgSi.gif) ( 圖片來源 wiki ) ## 二、實際操作 ### 使用哪種資料結構:Array * 遍歷陣列 * 將第一個元素設定為最小值 * 遍歷未排序的元素 * 如果未排序元素 < 當前最小值 * 將未排序元素設定為當前最小值 * 將最小值和第一個未排序的元素交換位置 * 向右移動標記 **邏輯:** ```1 arr <- an unsorted array of integers let len be the length of arr for i (0 to len-1) do let minIndex = i for j (i+1 to len-1) do if (arr[j] < arr[minIndex]) then minIndex = j end if end for swap(arr, i, minIndex) end for func swap(arr, firstIndex, minIndex): temp = arr[firstIndex] arr[firstIndex] = arr[minIndex] arr[minIndex] = temp end func ``` **程式碼實作:** ```javascript=1 debugger function swap(arr, firstIndex, minIndex) { temp = arr[firstIndex] arr[firstIndex] = arr[minIndex] arr[minIndex] = temp } function selectionSort(arr) { for (let i = 0; i < arr.length; i++) { let minIndex = i for (j=i+1 ; j<arr.length ; j++) { minIndex = (arr[j]<arr[minIndex]) ? j : minIndex } swap(arr, i, minIndex) console.log(arr) } } selectionSort([8, 9, 2, 5, 1]) ``` <!-- ## 四、優化改善 內容 --> ## 三、時間複雜度 Big O * 總共找了 n + (n-1) +...+ 2 + 1 * 也就是 (n+1) * n / 2 * 時間複雜度會忽略係數,所以為 $O(n^2)$