希尔排序

93 阅读1分钟

原理

  • 选择一个间隔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)