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用图作提交按钮或超连接
Mar 26 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
May 07 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
Aug 16 Javascript
如何在Angular.JS中接收并下载PDF
Nov 26 Javascript
JS实现的简单图片切换功能示例【测试可用】
Feb 14 Javascript
详解webpack和webpack-simple中如何引入css文件
Jun 28 Javascript
webstorm添加vue.js支持的方法教程
Jul 05 Javascript
webpack多入口文件页面打包配置详解
Jan 09 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
Nov 11 Javascript
vue.js实现的幻灯片功能示例
Jan 18 Javascript
javascript实现鼠标点击生成文字特效
Dec 24 Javascript
vue全屏事件开发详解
Jun 17 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开发过程中关于继承的使用方法分享
2011/06/17 PHP
php在文件指定行中写入代码的方法
2012/05/23 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
js 自动播放的实例代码
2013/11/19 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
javascript基本算法汇总
2016/03/09 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
2017/12/08 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
python opencv之SIFT算法示例
2018/02/24 Python
python binascii 进制转换实例
2019/06/12 Python
如何在python中实现随机选择
2019/11/02 Python
python基于opencv 实现图像时钟
2021/01/04 Python
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
巴西购物网站:Submarino
2020/01/19 全球购物
幼儿教师个人求职信范文
2013/09/21 职场文书
市场策划求职信
2014/08/07 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python