#希尔排序

Shell Sort

也叫缩小增量排序,是插入排序的一种更高效的改进版本

希尔排序是基于插入排序改进

插入排序是每次往有序数组中逐个比较然后找到位置插入,或者说逐个交换直到有序

而希尔排序就是将使用一个间隔来减少交换次数

这个间隔就是增量

每次循环都缩小这个间隔,直到最后一次和插入排序相同

这就是缩小增量了

#步骤

  1. 设计一个间隔与间隔的缩小方式
  2. 将插入排序中的在有序数组中逐 1 比较改为逐间隔比较

#代码实现

function sortArray(nums: number[]): number[] {
  if (nums.length <= 1) {
    return nums
  }

  // 使用间隔nums.length/2,并且每次循环都将间隔/2
  for (
    let gap = Math.floor(nums.length / 2);
    gap > 0;
    gap = Math.floor(gap / 2)
  ) {
    // 将插入排序中的在有序数组中逐1比较改为逐间隔比较
    for (let i = gap; i < nums.length; i++) {
      for (let j = i; j >= gap && nums[j - gap] > nums[j]; j = j - gap) {
        ;[nums[j - gap], nums[j]] = [nums[j], nums[j - gap]]
      }
    }
  }

  return nums
}

#性能

时间复杂度:O(n(logn)²) 空间复杂度:O(1) 稳定性:不稳定