算法系列之插入排序
作為一個程式員,一些基本的排序演算法是必須要掌握的。以前人們總覺得演算法是後端程式設計師去學的,前端只需要專注於網頁的美觀以及 JS 的基本邏輯互動就行,然而,近幾年隨著前端行業的發展,前端越來越注重邏輯互動,如果你還像很久之前那樣只知道用 HTML + CSS 去構建網頁,那就落伍了。如今,前端程式設計師也需要對演算法有一定的瞭解,不說別的,多掌握點東西總是好的。今天的文章介紹的是排序演算法中的 插入排序 。
什麼是排序
維基百科中這樣說明:一種能將一串資料依照特定排序方式進行排列的一種演算法。生活中也有很多排序的例子:超市購物排隊,學生成績排序,班級座位排序等。排序可以分為內部排序還有外部排序。內部排序是指待排序列完全存放在記憶體中所進行的排序過程,適合不太大的元素序列;外部排序能夠處理極大量資料的排序演算法,通常需要結合外儲存器(硬碟)使用。

各種排序歸類
什麼是插入排序
插入排序的原理跟撲克牌差不多,打過撲克牌的都知道,我們拿到一副牌,會按照大小將這些牌進行排列,每拿一張牌,就將它與前面的牌進行比較,比那張牌大又比那張牌小,那麼就在這個位置將其插入,然後繼續拿其它的牌排列,將它們都插入到符合它們順序的位置上,這就是插入排序的原理: 每次將待排序的元素抽出來,與前面的元素進行比較,如果小於則交換位置,直到大於某個元素則排在這個元素之後,插入排序每次都需要由後向前對元素進行一一比較 。
實現程式碼
以下是插入排序的程式碼:
function insertSort(arr){ if(Object.prototype.toString.call(arr).slice(8,-1) === 'Array'){ console.time('插入排序耗時: '); for(var i=1;i<arr.length;i++){ var key = arr[i]; var j = i - 1; while(j>=0 && arr[j] > key){ arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } console.timeEnd('插入排序耗時: '); return arr; }else{ return 'this is not an Array'; } } var arr = [3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(insertSort(arr)); // 插入排序耗時: : 0.255126953125ms // [2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
第一行中的 Object.prototype.toString.call(arr)
返回的是 [object Array]
,然後我們通過 JS 中的 slice()
方法就可以判斷傳入的是不是一個數組,如果不是,則返回提示文字。程式碼中使用了一個臨時變數 key 來儲存需要比較的元素,通過後一個元素不斷地與前一個元素進行比較,如果大了,就賦值交換,然後座標 j-- ;最後將 key 裡儲存的值放到正確的位置上。
時間和空間複雜度
最好的情況:T(n) = O(n)
最壞的情況:T(n) = O(n²)
平均時間複雜度是:T(n) = O(n²)
空間複雜度為:O(1)
引用
維基百科: ofollow,noindex">https://zh.wikipedia.org/wiki/
程式碼出處: https://blog.csdn.net/jizhen_tan/article/details/52555639