概念
这是一个叫希尔的人想到的,所以叫做希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
逻辑
首先,选择增量 gap = 10/2 = 5 把所有的数分成5组,对每组进行排序
缩小增量继续以 gap = gap/2 = 2 把所有的数分成2组,对每组进行排序
通过这种方式,缩小这个数组的有序度,然后在对整个数组进行插入排序
用这种方式减小复杂度
代码
// 希尔算法
function shell_sort(nums) {
let len = nums.length;
// 初始步数
let gap = parseInt(len / 2);
// 逐渐缩小步数
while (gap) {
// 从第gap个元素开始遍历
for (let i = gap; i < len; i++) {
// 逐步其和前面其他的组成员进行比较和交换
for (let j = i - gap; j >= 0; j -= gap) {
if (nums[j] > nums[j + gap]) {
[nums[j], nums[j + gap]] = [nums[j + gap], nums[j]];
}
else {
break;
}
}
}
gap = parseInt(gap / 2);
}
}
var sortArr = [9, 6, 3, 5, 2, 1, 7, 9999, 343, 6, 643, 243, 544, 5, 63, 234, 0, 56, 123]
shell_sort(sortArr)
console.log(sortArr)