前端工程師算法系列(3)-插入排序
插入排序
一、原理解析
- 從第一個元素開始,該元素可以認為已經被排序
- 取出下一個元素,在已經排序的元素序列中從後向前掃描
- 把取出的元素放到已排序的元素中間的合適位置
- 重複步驟2~3
就像排隊一樣,依次每次挑一個同學,把該同學“插入”到已經排好的部分隊伍裡。
二、範例演示
以下表格里,紅色表示選中的待排序的數字,藍色表示最終排好的數字。
第一輪:對於第一個元素(紅色),變成已排序元素(藍色)
第二輪:對於第二個元素,和已排序元素(藍色數字)比較,插入到已排序元素中合適的位置(8放到10前面,之後都變成已排序元素)
第三輪:對於第三個元素,和已排序元素(藍色數字)比較,插入到已排序元素中合適的位置(9放到8和10中間,之後變成已排序元素)
...

三、實現方式
插入法JS 版
function insertionSort(arr) { for(let i = 1; i < arr.length; i++) { for(let j = 0; j < i; j++) { if(arr[i] < arr[j]) { arr.splice(j, 0, arr[i]) arr.splice(i+1, 1) break } console.log(arr) } } } var arr = [10, 34, 21, 47, 3, 28] insertionSort(arr) console.log(arr)
插入法普通版
function insertionSort(arr) { for(var i = 1; i < arr.length; i++) { var temp = arr[i] for(var j = i; j > 0 && arr[j-1] > temp; j--) { arr[j] = arr[j-1] } arr[j] = temp } } var arr = [10, 34, 21, 47, 3, 28] insertionSort(arr) console.log(arr)
四、效率測試
下面我們測試排序效能
let arr = randomArr(10000, 100) console.time('sectionSort') insertionSort(arr) console.timeEnd('sectionSort') function randomArr( arrLen = 100, maxValue = 1000 ) { let arr = [] for(let i = 0; i < arrLen; i++) { arr[i] = Math.floor((maxValue+1)*Math.random()) } return arr } function insertionSort(arr) { for(let i = 1; i < arr.length; i++) { for(let j = 0; j < i; j++) { if(arr[i] < arr[j]) { arr.splice(j, 0, arr[i]) arr.splice(i+1, 1) break } } } }
經瀏覽器測試,陣列長度增加10倍,排序時間約增加100倍。
五、複雜度分析
時間複雜度為 O(n^2) ,和上面的測試基本一致。
本文作者:若愚如果你覺得不錯,或者發現文章中的錯誤,或者有更好的建議,歡迎演算法交流群交流,點此掃碼進群(如無法掃描進群,加微信:hungervalley 拉入群)。