JS完成希尔排序

希尔排序本质上是一种插入排序,然则对数列举行了等距离分组处置惩罚,在每一组中做插入排序,这一优化使得时候复杂度降到了O(n^2)以下。

基础思想

希尔排序是按肯定的距离对数列举行分组,然后在每个分组中做插入排序;随后逐次减少距离,在每个分组中做插入排序…直到距离即是1,做一次插入排序后完毕。

那末题目来了,距离应当取多大,怎样减少?一般我们去取初始距离为数列长度的一半:gap = length/2,以 gap = gap/2 的体式格局减少,下面细致图解全部历程。

原始数组数组以下:

《JS完成希尔排序》

首先取距离为 gap = length/2 = 4,将数组分为以下的4组,对每一组实行插入排序:

《JS完成希尔排序》

第一次排序,每一组较小的元素都移到了相对靠前的位置(这个状况能够叫 n-sorted,即以n为gap分组有序),能够设想相对有序的数组能够更有利于背面的排序。接着继承分组,gap = gap/2 = 2,对每一组实行插入排序:

《JS完成希尔排序》

继承对数组分组,gap = gap/2 = 1,即一切元素构成一组,做插入排序完成算法:

《JS完成希尔排序》

《JS完成希尔排序》

代码完成

内层轮回运用的插入排序与一般的插入排序基础一致,只是每次挪动的步长变成 gap 而不是 1:

// shellSort
function shellSort(arr) {
  for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)) {
    // 内层轮回与插入排序的写法基础一致,只是每次挪动的步长变成 gap
    for(let i = gap; i < arr.length; i++) {
      let j = i;
      let temp = arr[j];
      for(; j> 0; j -= gap) {
        if(temp >= arr[j-gap]) {
          break;
        }
        arr[j] = arr[j-gap];
      }
      arr[j] = temp;
    }
  }
  return arr;
}

// example
let arr = [2,5,10,7,10,32,90,9,11,1,0,10];
alert(shellSort(arr));
    原文作者:Leon
    原文地址: https://segmentfault.com/a/1190000015489853
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞