仅仅提供代码实现,原理请问度娘。
1、 数据和工具类
module.exports.list = [9, 3, 4, 32, 42, 3, 45, 33, 2, 76, 89, 34];
module.exports.swap = function (list, i, j) {
let temp = list[i];
list[i] = list[j];
list[j] = temp;
};
module.exports.display = function (list) {
let str = "";
for (let i = 0; i < list.length; i++) {
str += list[i] + ", ";
}
console.log(str.replace(/, $/, ""));
};
2、希尔排序实现
/**
* 希尔排序: 插入排序的一种,又称为"缩小增量排序"。
*/
const { list, swap, display } = require("./utils/common");
//局部的插入排序,
function shellSort(list) {
//外层循环用于控制增量大小,以及每个增量都进行快速排序一次。
//定义逐渐减小的增量。且因为 Math.trunc(gap /=2) 能保证最后最后一轮一定是 gap=1
for (let gap = list.length; gap > 0; gap = Math.trunc(gap / 2)) {
for (let i = 0; i < list.length - gap; i++) {
//表示已经最后一个有序元素的下标。
let preIndex = i;
//表示下一个等待排序的元素。
let waitSortVal = list[preIndex + gap];
while (preIndex >= 0 && waitSortVal <= list[preIndex]) {
list[preIndex + gap] = list[preIndex];
preIndex -= gap;
}
list[preIndex + gap] = waitSortVal;
}
}
}
shellSort(list);
display(list);