希尔排序又名缩小增量排序,算是插入排序的增强版.
基本思想: 把记录按照步长gap分组, 对每次分完组后采用直接插入排序方法进行排序
1.gap的值从哪取?
答:Math.floor(arr.length / 2 ) = gap (即取数组长度的一半,取舍)
2.gap会变吗?
答: gap的值会变,是上次gap值的一半取舍 Math.floor(gap / 2 ) = gap
3.当gap === 1时怎么办? 答: 当gap === 1,就对整个数组进行一次排序,出来的排序结果就是最后的结果
代码来了👇👇👇
function shellSort(array) { // 希尔排序
let gap = Math.floor(array.length / 2); // 计算gap值
while (1 <= gap) { // 当gap>=1 符合条件
// 把距离为 gap 的元素编为一个组,扫描所有组
for (let i = gap; i < array.length; i++) {
let j = 0;
let temp = array[i]; // 中间值
// 对距离为 gap 的元素组进行排序
// j >= 0 是为了保证 后一个元素i在中间值gap位置之后
// temp < array[j] 是为了判断 后一个值大于前一个值才进行换位置
for (j = i - gap; j >= 0 && temp < array[j]; j -= gap) {
array[j + gap] = array[j];
}
array[j + gap] = temp;
}
gap = Math.floor(gap / 2); // 减小增量
}
return array;
}