插入排序是一种简单直观的排序算法。主要方法就是从数组值一个一个取出进行排序。
特性:
- 原理简单,代码实现简洁,易于理解和手写;
- 对小规模数据(n<100)和基本有序的数据排序效率极高(接近 O(n) ),优于冒泡排序;
- 时间复杂度为 O(n^2) ,数据量大(n>1000),效率急剧下降;
javascript
const insertSort = (arr) => {
for(let i = 1;i < arr.length;i++) {
const value = arr[i]
let j = i - 1
while(j >=0 && arr[j] > value) {
arr[j+1] = arr[j]
j--
}
arr[j+1] = value
}
}
const arr = [1100,200,500,1600,25,13,685,23651,0,12,35,478,66,5,3,9,8,456,58,68,95,25,12,45,65,8,78,95,68,321,456,122,258,951,864,57,85,95,96,93,92,94,98,25,26,28,29,68,65,62,67,789,752,751,745,6859,3,20,359,215,687,592]
insertSort(arr)
console.log(arr)
希尔排序(Shell's Sort): 是插入排序的一种改进 算法,又称**"缩小增量排序"**(Diminishing Increment Sort),是Shell在1959年提出的。

javascript
const shellSort = (arr) => {
let n = arr.length
let gap = Math.floor(n / 2)
while(gap > 0) {
for(let i = gap;i < n;i++) {
const value = arr[i]
let j = i - gap
while(j >= 0 && arr[j] > value) {
arr[j+gap] = arr[j]
j -= gap
}
arr[j+gap] = value
}
gap = Math.floor(gap / 2)
}
}
const arr = [1100,200,500,1600,25,13,685,23651,0,12,35,478,66,5,3,9,8,456,58,68,95,25,12,45,65,8,78,95,68,321,456,122,258,951,864,57,85,95,96,93,92,94,98,25,26,28,29,68,65,62,67,789,752,751,745,6859,3,20,359,215,687,592]
shellSort(arr)
console.log(arr)
gap的取法有多种,Knuth 提出 gap = | gap /3 | + 1 是效果比较好的。
javascript
const shellSort = (arr) => {
let n = arr.length
let gap = n
while(gap > 1) {
gap = Math.floor(gap / 3) + 1
for(let i = gap;i < n;i++) {
const value = arr[i]
let j = i - gap
while(j >=0 && arr[j] > value) {
arr[j+gap] = arr[j]
j -= gap
}
arr[j+gap] = value
}
}
}
const arr = [1100,200,500,1600,25,13,685,23651,0,12,35,478,66,5,3,9,8,456,58,68,95,25,12,45,65,8,78,95,68,321,456,122,258,951,864,57,85,95,96,93,92,94,98,25,26,28,29,68,65,62,67,789,752,751,745,6859,3,20,359,215,687,592]
shellSort(arr)
console.log(arr)