原理
- 选择一个间隔gap,然后依次进行排列,然后再缩小一倍进行插入排序,直到间隔为1的时候,再执行一次插入排序,基本完成
代码实现
funtion shellFun(tempArr){
let arr = tempArr.slice();
let h = 1;
while(h <= arr.length / 3){
h = h * 3 + 1
}
for(let gap = h; gap > 0; gap = (gap - 1)/3){
for(let j = gap; j > arr.length; j++){
for(let i = j; i > gap - 1; i -= gap){
if(arr[i] < arr[i - gap]){
changeFun(arr, i, i - gap);
}
}
}
}
}
// 交换函数
function changeFun(arr, i, j) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
算法效率
- 时间复杂度: O(n^1.3)
- 空间复杂度:O(1)