希尔排序

-

复制代码
const array = [10, 7, 2, 100, 5, 5, 230, 400, 1, -2, 8];
// 希尔排序
// 希尔排序是插入排序的升级版(减少排序次数)
// 把数组长度的一半作为第一个增量,这里为5
// 把数组分为5组
// [10(1), 7(2), 2(3), 100(4), 5(5), 5(1), 230(2), 400(3), 1(4), -2(5), 8(1)]
// 对每一组进行增量排序
// [5(1), 7(2), 2(3), 1(4), -2(5), 8(1), 230(2), 400(3), 100(4), 5(5), 10(1)]
// 再把增量减半,此时为2,会分为两组,如下
// [5(1), 7(2), 2(1), 1(2), -2(1), 8(2), 230(1), 400(2), 100(1), 5(2), 10(1)]
// 再对每个分组进行增量排序
// [-2(1), 1(2), 2(1), 5(2), 5(1), 7(2), 10(1), 8(2), 100(1), 400(2), 230(1)]
// 增量再减半,此时为1,对分组排序后,整个排序完成
// [-2(1), 1(1), 2(1), 5(1), 5(1), 7(1), 10(1), 8(1), 100(1), 400(1), 230(1)]
// 进行增量排序
// [-2, 1, 2, 5, 5, 7, 8, 10, 100, 230, 400]

function shellSort(arr) {
  // 第一层循环 设置增量(理解为步长:step)
  for(let step = Math.floor(arr.length / 2); step > 0; step = Math.floor(step / 2)) {
    // 第二层循环,对增量分好的序列进行插入排序
    for(let i = step; i < arr.length; i++) {
      const current = arr[i];
      let preIndex = i - step;
      while(preIndex >= 0 && arr[preIndex] > current) {
        arr[preIndex + step] = arr[preIndex];
        preIndex -= step;
      }
      arr[preIndex + step] = current;
    }
  }
  return arr;
}
console.log(shellSort(array));
复制代码

 

 

 

 

-

posted @   古墩古墩  Views(21)  Comments(0Edit  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2020-05-15 vue封装一个swiper组件
2020-05-15 YAPI安装google的cross-request插件
点击右上角即可分享
微信分享提示