>[success] # 插入排序
[不錯的文章先讀一下](https://juejin.im/post/6844904167778041869#heading-0)
~~~
1.引用書里的話來說,插入排序每次排一個數組項,以此方式構建最后的排序數組。假定第一項已經排序了。
接著, 它和第二項進行比較——第二項是應該待在原位還是插到第一項之前呢?這樣,頭兩項就已正確 排序,
接著和第三項比較(它是該插入到第一、第二還是第三的位置呢),以此類推。
2.通俗的理解'插入排序'和'選擇排序' 在整體思路方面差不多,首先'插入排序'也是將整個排序分成兩個區間,
分別是'排序區間'和'未排序區間',每次會從'未排序區間'中取值去以排序區間中比較,比較后將這個值插入到
'以排序區間'
3.'插入排序'和'選擇排序' 做個比較理解,'插入'是從'未排序區間'取值在'以排序區間去比較','選擇'是從'未排序區間'
依次找到最小值放到'以排序區間'
4.如圖紅色區域就是'已排序區間',黃色就是'未排序'區間,依次從黃色區域取值去紅色區域比較,并且將值插入到
合適的紅色區域
~~~


>[info] ## 代碼實現
* 通用方法
~~~
// 生成隨機數數組
function randomArray(max, min, len) {
let randomNum = 0
const array = []
for (let i = 0; i < len; i++) {
randomNum = Math.floor((Math.random() * (max - min + 1)) + min)
array.push(randomNum)
}
return array
}
const array = randomArray(1, 10, 5)
const Compare = {
LESS_THAN: -1,
BIGGER_THAN: 1,
EQUALS: 0
};
function defaultCompare(a, b) {
if (a === b) {
return Compare.EQUALS;
}
return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
}
~~~
>[danger] ##### 代碼效果
~~~
1.這里默認將第一個元素作為'已排序'區間中的內容,這樣方便后續邏輯
2.通過過動態圖來理解下面插入算法中的while邏輯,首先是吧整個數組分成兩個區域
'已排序區域' 一個是 '為排序區域',第一層for是從為排序區域取出一個,'已排序區域'就是
從當前這個值往后都是以排序區域,因此while 的判斷循環j 是從取點位置開始的,注意
動圖插入的那個動作,如果你比我小我就把你往后移動,如果你比我大我就到大了位置,
整個while 就結束了,這個值就到了j的位置
~~~
~~~
// 插入排序
function insertionSort(array, compareFn = defaultCompare) {
const {
length
} = array;
let temp;
for (let i = 1; i < length; i++) {
let j = i;
temp = array[i];
while (j > 0 && compareFn(array[j - 1], temp) ===
Compare.BIGGER_THAN) {
array[j] = array[j - 1];
j--;
}
array[j] = temp;
}
return array;
};
insertionSort(array)
console.log(array)
~~~
- 接觸數據結構和算法
- 數據結構與算法 -- 大O復雜度表示法
- 數據結構與算法 -- 時間復雜度分析
- 最好、最壞、平均、均攤時間復雜度
- 基礎數據結構和算法
- 線性表和非線性表
- 結構 -- 數組
- JS -- 數組
- 結構 -- 棧
- JS -- 棧
- JS -- 棧有效圓括號
- JS -- 漢諾塔
- 結構 -- 隊列
- JS -- 隊列
- JS -- 雙端隊列
- JS -- 循環隊列
- 結構 -- 鏈表
- JS -- 鏈表
- JS -- 雙向鏈表
- JS -- 循環鏈表
- JS -- 有序鏈表
- 結構 -- JS 字典
- 結構 -- 散列表
- 結構 -- js 散列表
- 結構 -- js分離鏈表
- 結構 -- js開放尋址法
- 結構 -- 遞歸
- 結構 -- js遞歸經典問題
- 結構 -- 樹
- 結構 -- js 二搜索樹
- 結構 -- 紅黑樹
- 結構 -- 堆
- 結構 -- js 堆
- 結構 -- js 堆排序
- 結構 -- 排序
- js -- 冒泡排序
- js -- 選擇排序
- js -- 插入排序
- js -- 歸并排序
- js -- 快速排序
- js -- 計數排序
- js -- 桶排序
- js -- 基數排序
- 結構 -- 算法
- 搜索算法
- 二分搜索
- 內插搜索
- 隨機算法
- 簡單
- 第一題 兩數之和
- 第七題 反轉整數
- 第九題 回文數
- 第十三題 羅馬數字轉整數
- 常見一些需求
- 把原始 list 轉換成樹形結構