插入排序
- 插入排序思想的核心是局部有序。
- 首先指定一数据X(从第一个数据开始),并将数据X的左边变成局部有序状态;
- 随后将X右移一位,再次达到局部有序之后,继续右移一位,重复前面的操作直至X移至最后一个元素。
代码如下:(可以打debug跟一下过程就完全理解了)
const arr = [6, 39, 220, 54, 30, 9999, 4, 78, 1, 1000]
//插入排序
function insertionSort(arr) {
//从第二个数开始, 默认第一个自己是局部有序
for(let i = 1; i < arr.length; i++) {
//保存当前的数
const temp = arr[i]
let j = i
while (arr[j-1] > temp && j > 0) {
// 比temp大, 往后移
arr[j] = arr[j-1]
j--
}
arr[j] = temp
}
}
insertionSort(arr)
console.log(arr);
希尔排序
希尔排序是插入排序的一种高效的改进版,效率比插入排序要高,时间复杂度小于 N方
- 希尔排序主要通过对数据进行分组实现排序;
- 根据设定的增量(gap)将数据分为gap个组(组数等于gap),再在每个分组中进行局部排序;
假如有数组有10个数据,1,2,3,4,5,6,7,8,9,10 , gap设置为5, 那么分组就是 【1,6】【2,7】 【3,8】【4,9】 【5,10】分为五组, 即组数等于增量gap。
- 排序之后,减小增量,继续分组,再次进行局部排序,直到增量gap=1为止。随后只需进行微调就可完成数组的排序;
实现代码
function shellSort() {
const length = arr.length
//这里gap设置为长度的一半
let gap = Math.floor(length / 2)
//gap等于一执行最后一遍,相当于插入排序,但是减少了while循环
while (gap >= 1) {
for (let i = gap; i < length; i++) {
const temp = arr[i]
let j = i
while (arr[j - gap] > temp && j > gap - 1) {
arr[j] = arr[j - gap]
j = j - gap
}
arr[j] = temp
}
//改变gap, gap=0退出
gap = Math.floor(gap / 2)
}
}
shellSort(arr)
console.log(arr);