随着 gap 的逐渐缩小,最后一轮为 gap = 1 的插入排序时,数组已经实际上基本有序,使用插入排序会得到最高的效率
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
varShellSort = arr => { let n = arr.length for (let gap = n >> 1; gap > 0; gap >>= 1) { for (let i = gap; i < n; i++) { let x = arr[i] let j = i - gap while (j >= 0 && x < arr[j]){ arr[j + gap] = arr[j] j -= gap } arr[j + gap] = x } } return arr }
varShellSort = arr => { let n = arr.length let maxGap = 1; while (maxGap <= n / 3) { maxGap = maxGap * 3 + 1; } for (let gap = maxGap; gap > 0; gap = (gap - 1) / 3) { for (let i = gap; i < n; i++) { let x = arr[i] let j = i - gap while (j >= 0 && x < arr[j]){ arr[j + gap] = arr[j] j -= gap } arr[j + gap] = x } } return arr }