1.概念
希尔排序是把记录按下标的一定增量分组,对每组使用,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有元素被分为一组,算法终止。
2. 算法原理
比如我们有如下原始数组:[20,2,6,29,31,9,25,11]
- 首先,我们选择序列长度的一半4,作为增量进行分组
如图所示:20和31一组,2和9一组,6和25一组,29和11一组。
-
对每一组使用插入排序,排序后如下:
-
缩小增量,增量缩小为原来的一半,也就是2,再进行分组排序。
最后,我们进一步把增量缩小为原来一半,也就是1,这相当于直接在序列上进行插入排序,排序结果如下
算法代码
const len = arr.length
for (let gap = ~~(len / 2); gap > 0; gap = ~~(gap / 2)) {
for(let i = gap; i < len; i++) {
// 从第gap个元素开始,逐个对其所在组进行直接插入排序
let j = i
let temp = arr[j]
while(j - gap >= 0 && temp < arr[j - gap]) {
arr[j] = arr[j - gap]
j -= gap
}
arr[j] = temp
}
}
}