十大排序算法(JavaScript实现 )- 希尔排序 Shell Sort

164 阅读1分钟
  1. 十大排序算法(JavaScript实现 )- 冒泡排序 Bubble Sort

  2. 十大排序算法(JavaScript实现 )- 选择排序 Selection Sort

  3. 十大排序算法(JavaScript实现 )- 插入排序 Insertion Sort

  4. 十大排序算法(JavaScript实现 )- 希尔排序 Shell Sort

  5. 十大排序算法(JavaScript实现 )- 快速排序 Quick Sort

  6. 十大排序算法(JavaScript实现 )- 归并排序  Merge Sort

  7. 十大排序算法(JavaScript实现 )- 计数排序 Count Sort

  8. 十大排序算法(JavaScript实现 )- 桶排序 Bucket Sort

  9. 十大排序算法(JavaScript实现 )- 基数排序 Radix Sort

  10. 十大排序算法(JavaScript实现 )- 堆排序 Heap Sort

1.概念

希尔排序是把记录按下标的一定增量分组,对每组使用,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有元素被分为一组,算法终止。

2. 算法原理

比如我们有如下原始数组:[20,2,6,29,31,9,25,11]

图片.png

  1. 首先,我们选择序列长度的一半4,作为增量进行分组

图片.png
如图所示:20和31一组,2和9一组,6和25一组,29和11一组。

  1. 对每一组使用插入排序,排序后如下:
    图片.png

  2. 缩小增量,增量缩小为原来的一半,也就是2,再进行分组排序。

图片.png

最后,我们进一步把增量缩小为原来一半,也就是1,这相当于直接在序列上进行插入排序,排序结果如下

图片.png

算法代码

  const len = arr.length
  for (let gap = ~~(len / 2); gap > 0; gap = ~~(gap / 2)) {
    for(let i = gap; i < len; i++) {
      // 从第gap个元素开始,逐个对其所在组进行直接插入排序
      let j = i
      let temp = arr[j]
      while(j - gap >= 0 && temp < arr[j - gap]) {
        arr[j] = arr[j - gap]
        j -= gap
      }
      arr[j] = temp
    }
  }
}