一、是什麼
選擇排序(Selection sort)是一種簡單直觀的排序演算法,無論什麼資料進去都是 O(n²)
的時間複雜度,所以用到它的時候,資料規模越小越好
其基本思想是:首先在未排序的數列中找到最小(or最大)元素,然後將其存放到數列的起始位置
然後再從剩餘未排序的元素中繼續尋找最小(or最大)元素,然後放到已排序序列的末尾
以此類推,直到所有元素均排序完畢
舉個例子,一個陣列為 56、12、80、91、29,其排序過程如下:
- 第一次遍歷時,從下標為 1 的位置即 56 開始,找出關鍵字值最小的記錄 12,同下標為 0 的關鍵字 56 交換位置。此時陣列為 12、56、80、91、20
- 第二次遍歷時,從下標為 2 的位置即 56 開始,找出最小值 20,同下標為 2 的關鍵字 56 互換位置,此時陣列為12、20、80、91、56
- 第三次遍歷時,從下標為 3 的位置即 80 開始,找出最小值 56,同下標為 3 的關鍵字 80 互換位置,此時陣列為 12、20、56、91、80
- 第四次遍歷時,從下標為 4 的位置即 91 開始,找出最小是 80,同下標為 4 的關鍵字 91 互換位置,此時排序完成,變成有序陣列
二、如何實現
從上面可以看到,對於具有 n
個記錄的無序表遍歷 n-1
次,第i
次從無序表中第 i
個記錄開始,找出後序關鍵字中最小的記錄,然後放置在第 i
的位置上
直至到從第n
個和第n-1
個元素中選出最小的放在第n-1
個位置
如下動畫所示:
用程式碼表示則如下:
function selectionSort(arr) { var len = arr.length; var minIndex, temp; for (var i = 0; i < len - 1; i++) { minIndex = i; for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 尋找最小的數 minIndex = j; // 將最小數的索引儲存 } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } return arr; }
第一次內迴圈比較N - 1
次,然後是N-2
次,N-3
次,……,最後一次內迴圈比較1次 共比較的次數是 (N - 1) + (N - 2) + ... + 1
,求等差數列和,得 (N - 1 + 1)* N / 2 = N^2 / 2
,捨去最高項係數,其時間複雜度為 O(N^2)
從上述也可以看到,選擇排序是一種穩定的排序
三、應用場景
和氣泡排序一致,相比其它排序演算法,這也是一個相對較高的時間複雜度,一般情況不推薦使用
但是我們還是要掌握氣泡排序的思想及實現,這對於我們的演算法思維是有很大幫助的
參考文獻
- https://baike.baidu.com/item/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F/9762418
- https://zhuanlan.zhihu.com/p/29889599
- http://data.biancheng.net/view/72.html
如果對您有所幫助,歡迎您點個關注,我會定時更新技術文件,大家一起討論學習,一起進步。