算法之旅 | 選擇排序法

HTML5學堂-碼匠:數據快速的計算與排序,與前端頁面性能有直接的關係。因爲排序的算法有不少,在本次「算法系列」的分享當中,咱們先從簡單易上手的選擇排序法開始,其它的排序算法會隨後陸續跟你們一塊兒分享。前端

算法的基本概念

算法是什麼,它有何做用

爲解決一個問題而採起的方法和步驟,稱爲算法。
咱們能夠把算法當作一本「福字剪紙教程」,其中每一種算法就是剪紙教程中的一種包含「固定步驟」的剪紙方法,使用者只要按照步驟進行剪紙,就能夠剪出好看的福字。
之因此有這麼多的算法,在於不一樣算法解決問題的效率各有不一樣適合不一樣的場景。隨着問題規模的增加,算法之間的差距會變的不可跨越。提高解決問題的效率,不單單依賴於選擇快速的硬件,還依賴於選擇有效(適合)的算法。算法

排序的使用場景

針對數組進行從大到小(或從小到大)的排序。例如:管理系統中按照成績的排序,按閱讀量對文章的排序等。
數據快速的計算與排序,與前端頁面性能有直接的關係。(譬如在頁面中有10000條的數據須要靠JS進行排序,採用不一樣的算法所消耗的時間差距甚大,直接影響着網站的用戶體驗)數組

常見的排序方法

較爲常見的排序方法,包括:冒泡排序、選擇排序、快速排序、二分法插入排序等。
因爲排序的算法有不少,在本次「算法系列」的分享當中,咱們先從簡單易上手的選擇排序法開始,其它的排序算法會隨後陸續跟你們一塊兒分享。性能

選擇排序法的基本原理

先找到序列中最小的數,將它和序列中第一個數交換位置;
接下來,在剩下的序列中繼續此操做:找到最小的數,將它和序列中的第二個數交換位置;
依此類推,直到將整個序列排序完成。
簡言之,選擇排序就是 —— 不斷地選擇剩餘序列中最小者,而後與未排序數列的「第一個」數字交換位置。網站

案例說明

圖片描述

實現選擇排序的步驟分解

排序次數

排序次數:序列長度 – 1(注意,不是比較次數);
由於序列中的最後一個數不須要再次比較大小,故排序次數爲 序列長度 – 1。spa

找到最小的數

序列中找到最小的數,並記錄該數的索引值;
由於minIndex默認開始爲0,則第一個數無需與自身比較,因此j = i + 1;code

// 遍歷序列,找到最小的數
for (var j = i + 1; j < len; j++) {
    if (arr[j] < arr[minIndex]) {
        // 記錄最小數的索引
        minIndex = j;
    };
};

在排序次數內屢次遍歷找到最小的數,所以須要再用一個for語句來進行控制。blog

// 排序次數
for (var i =   0; i < len - 1; i++) {

    // 默認最小數的索引爲i
    minIndex = i;

    // 遍歷序列,找到最小的數
    for (var j = i + 1; j < len; j++) {
        if (arr[j] < arr[minIndex]) {
            // 記錄最小數的索引
            minIndex = j;
        };
    };
};

兩數交換位置

利用temp變量,實現兩數組元素之間數值的交換,也就是交互位置。排序

temp =   arr[i];
arr[i] =   arr[minIndex];
arr[minIndex]   = temp;

選擇排序法完整代碼

var arr = [9, 8, 3, 1, 2, 4],
    len = arr.length,
    minIndex, temp;
 
    // 排序次數
    for (var i =   0; i < len - 1; i++) {

        // 默認最小數的索引爲i
        minIndex = i;

        // 遍歷剩下的序列,找到最小的數
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {
                // 記錄最小數的索引
                minIndex = j;
            };
        };

    // HTML5學堂出品

    // 兩數交互位置
    temp = arr[i];
    arr[i] = arr[minIndex];
    arr[minIndex] = temp;

};

console.log(arr);

歡迎溝通交流~~~HTML5學堂(碼匠)教程

選擇排序法的效率

算法複雜度的基本概念

算法複雜度分爲時間複雜度和空間複雜度(時間和空間是計算機最重要的資源,所以複雜度分爲時間和空間)。
時間複雜度:指執行算法所須要的計算工做量;
空間複雜度:指執行算法所須要的內存空間。

時間複雜度:O(n*n)

時間複雜度是總運算次數表達式中受n的變化影響最大的項(不含係數);
第一次循環比較n-1次,而後是n-2次,n-3次,依此類推,最後一次循環比較1次,總的比較次數和爲(n - 1 + 1) * n / 2,即進行比較操做的時間複雜度爲O(n^2)
Tips:選擇排序的比較次數與序列的初始排序無關。

空間複雜度:O(1)

排序算法須要一個額外的空間(temp變量)來交換元素的位置。

不穩定排序的一種算法

選擇排序是一種不穩定排序的算法。
好比:序列[3, 8, 3, 1, 9 ],第一次循環第1個元素3會和1交換,變成[1, 8, 3, 3, 9],此時,原序列中兩個3的前後順序被破壞。

clipboard.png

clipboard.png

相關文章
相關標籤/搜索