[路飞]_插入排序与希尔排序

797 阅读1分钟

插入排序(InsertionSort)

参考

插入排序的算法思想

循环数组从第二个元素开始向前比较,如果符合条件(比前面的大或者小),则交换位置,最终“插入”到相应的位置。

插入排序动画

o_200210053346482235d48a81823b830e50aaf5276c25.gif

代码实现(JS)

const arr = [9, 7, 8, 2, 5, 1, 3, 6, 4]

function InsertionSort(arr) {
  for (var i = 1; i < arr.length; i++) {
    var j = i
    while (j > 0) {
      if (arr[j] < arr[j - 1]) {
        [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]]
      } else 
        break
      }
      j--
    }
  }
}


InsertionSort(arr)

console.log(arr) //[1, 2, 3, 4, 5, 6, 7, 8, 9]

希尔排序(Shell Sort)

参考

希尔排序又称缩小增量排序由DL.Shell于1959年提出,因此得名。是插入排序的一种,对插入排序做了优化。

希尔排序的算法思想

使用插入排序,通过比较相距一定间隔(增量)的元素,每次比较所用的距离随着算法的进行而缩小,直到比较到相邻元素为止。

希尔排序时间复杂度是 O(n^(1.3-2)),空间复杂度为常数阶 O(1)。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多。

希尔排序图解

  • (1)初始增量第一趟 gap = length/2 = 4 ShellSort-01.png

  • (2)第二趟,增量缩小为 2 ShellSort-02.png

  • (3)第三趟,增量缩小为 1,得到最终排序结果 ShellSort-03.png

代码实现(JS)

const arr = [7, 6, 9, 3, 1, 5, 2, 4, 0]

function ShellSort(arr) {
  var len = arr.length
  for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
    for (var i = gap; i < len; i++) {
      var j = i
      var tmp = arr[j]
      if(arr[j] < arr[j - gap]){
        while (j - gap >=0 && tmp < arr[j - gap]) {
          arr[j] = arr[j - gap]
          j -= gap
        }
        arr[j] = tmp
      }
    }
  }
}

ShellSort(arr)

console.log(arr) // [0, 1, 2, 3, 4, 5, 6, 7, 9]