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 相关文章推荐
javascript新手语法小结
Jun 15 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
Aug 14 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
Aug 13 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
Oct 12 Javascript
jQuery如何使用自动触发事件trigger
Nov 29 Javascript
移动开发之自适应手机屏幕宽度
Nov 23 Javascript
关于Vue组件库开发详析
Jul 01 Javascript
浅析vue给不同环境配置不同打包命令
Aug 17 Javascript
Vue cli构建及项目打包以及出现的问题解决
Aug 27 Javascript
Layui实现带查询条件的分页
Jul 27 Javascript
vuex管理状态仓库使用详解
Jul 29 Javascript
vue.js 使用原生js实现轮播图
Apr 26 Vue.js
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
漂亮但不安全的CTB
2006/10/09 PHP
再次研究下cache_lite
2007/02/14 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
jQuery操作checkbox选择(list/table)
2013/04/07 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
Python获取文件ssdeep值的方法
2014/10/05 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
我的五年职业生涯规划
2014/01/23 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
工地食品安全责任书
2015/05/09 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
分析设计模式之模板方法Java实现
2021/06/23 Java/Android
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS