1.思路

(1)比如下面的数字, 81, 94, 11, 96, 12, 35, 17, 95, 28, 58, 41, 75, 15。

(2)我们先让间隔为 5进行排序: (35, 81), (94, 17), (11, 95), (96, 28), (12, 58), (35, 41), (17, 75), (95, 15)。

(3)我们再让间隔位 3, 进行排序:(35, 28, 75, 58, 95), (17, 12, 15, 81), (11, 41, 96, 94)。

(4)最后, 我们让间隔为 1, 也就是正确的插入排序. 这个时候数字都离自己的位置更近, 那么需要复制的次数一定会减少很多。

建议对于长度为N的序列,间隔最好为N/2,然后依次减少N/4,N/8...

2.代码实现
function ArrayList(){
  this.array = []

  ArrayList.prototype.insert = function(item){
    this.array.push(item)
  }

  ArrayList.prototype.shellSort = function(){
    let length = this.array.length
    let gap = Math.floor(length/2)

    while(gap>0){
      for(let i=gap; i<length; i++){
        let j=i
        let temp = this.array[i]

        while(j>gap-1 && this.array[j-gap]>temp){
          this.array[j] = this.array[j-gap]
          j = j-gap
        }

        this.array[j] = temp
      }
      gap = Math.floor(gap/2)
    }
  }
}
// 测试
var list = new ArrayList()
list.insert(3)
list.insert(6)
list.insert(4)
list.insert(2)
list.insert(11)
list.insert(10)
list.insert(5)
list.shellSort()
console.log(list)    // 2,3,4,5,6,10,11
posted on 2021-03-17 21:09  李起桉  阅读(93)  评论(0编辑  收藏  举报