希尔排序
2020-03-16 本文已影响0人
mapleLeaf_X
概念
希尔排序(shell sort) 是插入排序的一种又称“缩小增量排序”,是直接插入排序的一种更为高效的改进版本。
希尔排序是把记录按下表的一定增量分组, 对每组使用直接插入排序,随着增量的减少,每组的关键字越来越多,当增量减至1时,整个文件恰被分成一组,算法终止。

时间复杂度: 比直接插入排序要高效,为nlog(n)
算法稳定性:增量排序的时候会交换两个数值的位置,会变换位置,所以为非稳定排序。
算法实现
ort(arr) {
// 判断是否是数组,不是则抛出错误
if(!Array.isArray(arr)) {
throw new Error('传入的不是数组')
}
const len = arr.length;
// 判断长度是否小于等于1,是则直接返回
if(len <= 1) {
return arr;
}
/*
设定增量序列取值h(整数)
对相隔h的值进行插入排序
*/
for (let h = parseInt(len / 2); h > 0; h = parseInt(h / 2)) {
for (var i = h; i < len; i++) {
insertI(arr, h, i);
}
}
return arr
}
// 按照增量序列h进行直接插入排序
function insertI(arr, h, i) {
const temp = arr[i];
for (var j = i - h; j >= 0 && temp < arr[j]; j -= h) {
arr[j+h] = arr[j];
}
// 没有变化的时候不赋值
if(j + h !== i) {
arr[j+h] = temp
}
}