說說你對選擇排序的理解?如何實現?應用場景?

林恒發表於2024-04-23

一、是什麼

選擇排序(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

如果對您有所幫助,歡迎您點個關注,我會定時更新技術文件,大家一起討論學習,一起進步。

說說你對選擇排序的理解?如何實現?應用場景?

相關文章