js实现插入排序和希尔排序

插入排序

  • 插入排序思想的核心是局部有序。
  • 首先指定一数据X(从第一个数据开始),并将数据X的左边变成局部有序状态;
  • 随后将X右移一位,再次达到局部有序之后,继续右移一位,重复前面的操作直至X移至最后一个元素。
    代码如下:(可以打debug跟一下过程就完全理解了)
const arr = [6, 39, 220, 54, 30, 9999, 4, 78, 1, 1000]
//插入排序
function insertionSort(arr) {
  //从第二个数开始, 默认第一个自己是局部有序
  for(let i = 1; i < arr.length; i++) {
    //保存当前的数
    const temp = arr[i]
    let j = i
    while (arr[j-1] > temp && j > 0) {
     // 比temp大, 往后移
      arr[j] = arr[j-1]
      j--
    }
    arr[j] = temp
  }
}
insertionSort(arr)
console.log(arr);

希尔排序

希尔排序是插入排序的一种高效的改进版,效率比插入排序要高,时间复杂度小于 N方

  • 希尔排序主要通过对数据进行分组实现排序;
  • 根据设定的增量(gap)将数据分为gap个组(组数等于gap),再在每个分组中进行局部排序;

假如有数组有10个数据,1,2,3,4,5,6,7,8,9,10 , gap设置为5, 那么分组就是 【1,6】【2,7】 【3,8】【4,9】 【5,10】分为五组, 即组数等于增量gap。

  • 排序之后,减小增量,继续分组,再次进行局部排序,直到增量gap=1为止。随后只需进行微调就可完成数组的排序;

实现代码

function shellSort() {
  const length = arr.length
  //这里gap设置为长度的一半
  let gap = Math.floor(length / 2)
  //gap等于一执行最后一遍,相当于插入排序,但是减少了while循环
  while (gap >= 1) {
    for (let i = gap; i < length; i++) {
      const temp = arr[i]
      let j = i
      while (arr[j - gap] > temp && j > gap - 1) {
        arr[j] = arr[j - gap]
        j = j - gap
      }
      arr[j] = temp
    }
    //改变gap, gap=0退出
    gap = Math.floor(gap / 2)
  }
}
shellSort(arr)
console.log(arr);

你可能感兴趣的:(javascript,排序算法,算法)