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 相关文章推荐
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
node.js中的console.assert方法使用说明
Dec 10 Javascript
jquery实现简单手风琴菜单效果实例
Jun 13 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
Sep 14 Javascript
简单介绍JavaScript数据类型之隐式类型转换
Dec 28 Javascript
AngularJs Javascript MVC 框架
Jun 20 Javascript
js改变css样式的三种方法推荐
Jun 28 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
Jul 08 Javascript
jQuery实现表单动态添加数据并提交的方法
Jul 19 jQuery
浅谈Vue.js路由管理器 Vue Router
Aug 16 Javascript
JavaScript中的ES6 Proxy的具体使用
Jun 16 Javascript
JavaScript中layim之整合右键菜单的示例代码
Feb 06 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判断字符串在另一个字符串位置的方法
2014/02/27 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
利用Pycharm断点调试Python程序的方法
2018/11/29 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
python getpass实现密文实例详解
2019/09/24 Python
德国最大的服装、鞋子和配件在线商店之一:Outfits24
2019/07/23 全球购物
银行职员思想汇报
2013/12/31 职场文书
公司离职证明范本
2014/01/13 职场文书
体育活动总结范文
2014/05/04 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
企业公益活动策划方案
2014/08/24 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
java设计模式--原型模式详解
2021/07/21 Java/Android
Golang jwt身份认证
2022/04/20 Golang