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...
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