Javascript堆排序算法详解


Posted in Javascript onDecember 03, 2014

堆排序分为两个过程:

1.建堆。

堆实质上是完全二叉树,必须满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。

堆分为:大根堆和小根堆,升序排序采用大根堆,降序排序采用小根堆。

如果是大根堆,则通过调整函数将值最大的节点调整至堆根。

2.将堆根保存于尾部,并对剩余序列调用调整函数,调整完成后,再将最大跟保存于尾部-1(-1,-2,...,-i),再对剩余序列进行调整,反复进行该过程,直至排序完成。

//调整函数

function headAdjust(elements, pos, len){

  //将当前节点值进行保存

  var swap = elements[pos];

  //定位到当前节点的左边的子节点

  var child = pos * 2 + 1;

  //递归,直至没有子节点为止

  while(child < len){

    //如果当前节点有右边的子节点,并且右子节点较大的场合,采用右子节点

    //和当前节点进行比较

    if(child + 1 < len && elements[child] < elements[child + 1]){

      child += 1;

    }

    //比较当前节点和最大的子节点,小于则进行值交换,交换后将当前节点定位

    //于子节点上

    if(elements[pos] < elements[child]){

      elements[pos] = elements[child];

      pos = child;

      child = pos * 2 + 1;

    }

    else{

      break;

    }

    elements[pos] = swap;

  }

}

//构建堆

function buildHeap(elements){

  //从最后一个拥有子节点的节点开始,将该节点连同其子节点进行比较,

  //将最大的数交换与该节点,交换后,再依次向前节点进行相同交换处理,

  //直至构建出大顶堆(升序为大顶,降序为小顶)

  for(var i=elements.length/2; i>=0; i--){

    headAdjust(elements, i, elements.length);

  }

}

function sort(elements){

  //构建堆

  buildHeap(elements);

  //从数列的尾部开始进行调整

  for(var i=elements.length-1; i>0; i--){

    //堆顶永远是最大元素,故,将堆顶和尾部元素交换,将

    //最大元素保存于尾部,并且不参与后面的调整

    var swap = elements[i];

    elements[i] = elements[0];

    elements[0] = swap;

    //进行调整,将最大)元素调整至堆顶

    headAdjust(elements, 0, i);

  }

}

var elements = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8];

console.log('before: ' + elements);

sort(elements);

console.log(' after: ' + elements);

效率:

时间复杂度:最好:O(nlog2n),最坏:O(nlog2n),平均:O(nlog2n)。

空间复杂度:O(1)。

稳定性:不稳定

Javascript 相关文章推荐
新闻内页-JS分页
Jun 07 Javascript
侧栏跟随滚动的简单实现代码
Mar 18 Javascript
jquery 清空file域示例(兼容个浏览器)
Oct 11 Javascript
初识SmartJS - AOP三剑客
Jun 08 Javascript
javascript arguments使用示例
Dec 16 Javascript
js实现倒计时效果(小于10补零)
Mar 08 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
Vuex之理解state的用法实例
Apr 19 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
May 11 Javascript
BootStrap导航栏问题记录
Jul 31 Javascript
JavaScript实现仿Clock ISO时钟
Jun 29 Javascript
JavaScript之数组扁平化详解
Jun 03 Javascript
node.js下when.js 的异步编程实践
Dec 03 #Javascript
jquery操作 iframe的方法
Dec 03 #Javascript
使用js实现数据格式化
Dec 03 #Javascript
使用js获取图片原始尺寸
Dec 03 #Javascript
上传文件返回的json数据会被提示下载问题解决方案
Dec 03 #Javascript
使用jQuery实现验证上传图片的格式与大小
Dec 03 #Javascript
使用正则表达式的格式化与高亮显示json字符串
Dec 03 #Javascript
You might like
PHP时间格式控制符对照表分享
2013/07/23 PHP
php防止SQL注入详解及防范
2013/11/12 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
js交换排序 冒泡排序算法(Javascript版)
2014/10/04 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
Python 创建子进程模块subprocess详解
2015/04/08 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
群众路线党课主持词
2014/04/01 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
社区活动总结
2015/02/04 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python