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 相关文章推荐
Array.prototype.slice 使用扩展
Jun 09 Javascript
Javascript变量作用域详解
Dec 06 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
Jun 23 Javascript
javascript中Array()数组函数详解
Aug 23 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
Apr 08 Javascript
学习Bootstrap滚动监听 附调用方法
Jul 02 Javascript
基于JavaScript实现全选、不选和反选效果
Feb 15 Javascript
javascript实现二叉树遍历的代码
Jun 08 Javascript
layui 优化button按钮和弹出框的方法
Aug 15 Javascript
利用Node.js如何实现文件循环覆写
Apr 05 Javascript
vue实现图片按比例缩放问题操作
Aug 11 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 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
基于mysql的bbs设计(五)
2006/10/09 PHP
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
php中chdir()函数用法实例
2014/11/13 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
Js的MessageBox
2006/12/03 Javascript
JavaScript 学习 - 提高篇
2007/02/02 Javascript
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
node跨域请求方法小结
2017/08/25 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
浅析vue-router原理
2018/10/19 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
python requests爬取高德地图数据的实例
2018/11/10 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
老教师工作总结的自我评价
2013/09/27 职场文书
高中生毕业学习总结的自我评价
2013/11/14 职场文书
就业协议书怎么填
2014/04/11 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python