var arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04]; var len = arr.length; for (var fraction = Math.floor(len / 2); fraction > 0; fraction = Math.floor(fraction / 2)) { for (var i = fraction; i < len; i++) { for (var j = i - fraction; j >= 0 && arr[j] > arr[fraction + j]; j -= fraction) { // 为什么要 j-=fraction var temp = arr[j]; arr[j] = arr[fraction + j]; arr[fraction + j] = temp; } } } console.log(arr);
1
lyshine OP 不好意思, V2EX 似乎没法贴代码
|
2
lyshine OP 大家凑合着看吧
|
3
yukiww233 2019-01-29 17:42:30 +08:00
|
4
nichijou 2019-01-29 18:19:19 +08:00
markdown 了解一下
https://i.loli.net/2019/01/29/5c50277399d4a.png 在选中的循环里,每回都是一次 insertion sort, 如果满足了 arr[j] > arr[fraction + j] ,swap 之后还要继续和前面的比,这也是该句表达式 用 fraction + j 表示后面一个值的 index 而没有直接用 i 的原因。 |
5
nichijou 2019-01-29 18:20:44 +08:00 1
可以选择低速度观看。
|