数据结构与算法之排序: 希尔排序 (Javascript版)

排序

  • 排序:把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例)

希尔排序

  • 希尔排序是插入排序的一种,是针对直接插入排序算法的改进
  • 算法思路:
    • 把待排序的数列分为多个组
      • 间隔分组(通常为总长度的一半)
    • 然后再对每个组进行插入排序,先让数列整体大致有序
    • 之后,多次调整分组方式,使数列更加有序
      • 这里重新设置间隔分组(为前一次分组的一半)
    • 最后再使用一次插入排序,整个数列变得全部有序

算法实现

function shellSort(list) {
  const len = list.length;
  // 外部希尔排序
  for (let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
    // 内部插入排序的变形
    for (let i = gap; i < len; i++) {
      const tmp = list[i];
      let p = i;
      while(p > 0 && list[p - gap] > tmp) {
        list[p] = list[p - gap]; // 交换
        p = p - gap;
      }
      list[p] = tmp;
    }
  }
}

const list = [9, 12, 1, 3, -1, 22, 22, 31, 1, 0];
shellSort(list);
console.log('list: ', list); //  [-1, 0, 1, 1, 3, 9, 12, 22, 22, 31]

总结

  • 希尔排序的时间复杂度: O ( n 1.3 ) O(n^{1.3}) O(n1.3),这个数学推到比较麻烦,记住就行
  • 核心思想是:化远为近,体现在减少查找次数,减少移动元素的次数
  • 插入排序对乱序效率较低,希尔排序由此产生(是插入排序的一种变体)
  • 希尔排序将大序列拆分成若干个小序列进行排序,使得大序列逐渐变得有序,最后使用插入排序对大序列进行最终的排序
  • 所以,希尔排序又叫做缩小增量排序

你可能感兴趣的:(Data,Structure,and,Algorithms,算法,排序,希尔排序)