跳至主要內容

希尔排序

linwu大约 2 分钟

希尔排序

希尔排序(Shellsort),也被称为 Shell 排序或 Shell 方法,是一种原地比较排序算法。它可以看作是交换排序(冒泡排序)或插入排序的推广。该方法从远离彼此的元素开始,对它们进行排序,然后逐渐减小要比较的元素之间的间隔。从远离彼此的元素开始,它可以更快地将一些错位的元素移动到正确的位置,而不只是简单地与最近的邻居交换。

希尔排序
希尔排序

希尔排序的工作原理

为了方便理解,我们以间隔为4的情况作为示例。将所有间隔为4位置的值组成一个虚拟子列表。这些值是 {35, 14}, {33, 19}, {42, 27}{10, 44}

我们比较每个子列表中的值,并在原始数组中进行交换(如果需要)。经过这一步,新数组应该如下所示:

然后,我们以间隔2进行排序,这个间隔会生成两个子列表:{14, 27, 35, 42}{19, 10, 33, 44}

我们在原始数组中比较并交换值(如果需要)。经过这一步,数组应该如下所示:

更新:下面的图片中存在一个错误,结果数组应该是 [14, 10, 27, 19, 35, 33, 42, 44]

最后,我们使用间隔值为1对数组的剩余部分进行排序。希尔排序使用插入排序来对数组进行排序。

function shellSort(arr) {
  const len = arr.length;
  let gap = Math.floor(len / 2);

  while (gap > 0) {
    for (let i = gap; i < len; i++) {
      const current = arr[i];
      let j = i;

      while (j >= gap && arr[j - gap] > current) {
        arr[j] = arr[j - gap];
        j -= gap;
      }

      arr[j] = current;
    }

    gap = Math.floor(gap / 2);
  }

  return arr;
}

复杂度

名称最佳情况平均情况最坏情况内存稳定性备注
希尔排序n log(n)取决于间隔序列n (log(n))21

参考资料

关注公众号

和小伙伴们一起学习

加入技术交流群

扫描二维码 备注加群