算法系列之選擇排序

作為一個程序員,一些基本的排序算法是必須要掌握的。以前人們總覺得算法是后端程序員去學的,前端只需要專注于網頁的美觀以及 JS 的基本邏輯交互就行,然而,近幾年隨著前端行業的發展,前端越來越注重邏輯交互,如果你還像很久之前那樣只知道用 HTML + CSS 去構建網頁,那就落伍了。如今,前端程序員也需要對算法有一定的了解,不說別的,多掌握點東西總是好的。今天的文章介紹的是排序算法中的選擇排序

什么是排序

維基百科中這樣說明:一種能將一串數據依照特定排序方式進行排列的一種算法。生活中也有很多排序的例子:超市購物排隊,學生成績排序,班級座位排序等。排序可以分為內部排序還有外部排序。內部排序是指待排序列完全存放在內存中所進行的排序過程,適合不太大的元素序列;外部排序能夠處理極大量數據的排序算法,通常需要結合外存儲器(硬盤)使用。


各種排序歸類

什么是選擇排序

我的理解是選擇排序在于 “選擇” ,即先找到待排序數組中最小(也可以是最大)的數,然后把它排到數組的最前面,接著繼續找最小(最大)的數,然后依次排在前面排好的數后面。舉個例子可能方便理解一點,在讀小學的時候,剛開學老師要排座位,老師的考慮是讓高個子的同學坐后面,矮個子的坐前一點,這樣看黑板就不會被擋了,于是老師把同學們排成一排,一眼望去,找到最矮的小明,叫他站到前面去,接著又在剩下的人中找到最矮的小方,讓他排在小明后邊,重復這樣找下去,直到所有的同學都按照從矮到高的順序排列好,就可以分配座位了。選擇排序的過程大致如此。

實現代碼

以下是選擇排序的代碼:

function selectionSort(arr) {
    var len = arr.length;
    var minIndex, temp;
    console.time('選擇排序耗時');
    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;
    }
    console.timeEnd('選擇排序耗時');
    return arr;
}

var arr = [3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(selectionSort(arr));
// 選擇排序耗時: 0.327880859375ms 
// 2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50

代碼中使用了一個臨時變量 temp 來交換兩個數,用 minIndex 來表示找到的最小的數的索引,當后面一個數比這個最小的數還要小時,那么將這個數的小標賦給 minIndex ,然后將它跟前面的數交換位置,這樣的話,每次循環,我們就會找到最小的一個數,然后將它與當前遍歷到的數互換,等遍歷完的時候,基本上就排好啦。

時間和空間復雜度

最好的情況:T(n) = O(n2)
最壞的情況:T(n) = O(n2)
平均時間復雜度是:T(n) = O(n2)
空間復雜度為:O(1)

引用

維基百科: https://zh.wikipedia.org/wiki/
代碼出處: https://blog.csdn.net/jizhen_tan/article/details/52555639

推薦閱讀

算法系列之冒泡排序
Chrome 69 正式發布,新 UI 來了

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容