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版网站风格切换实例代码
Oct 06 Javascript
jMessageBox 基于jQuery的窗口插件
Dec 09 Javascript
JavaScript 原型继承之构造函数继承
Aug 26 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
Apr 19 Javascript
浅谈重写window对象的方法
Dec 29 Javascript
基于bootstrap插件实现autocomplete自动完成表单
May 07 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 Javascript
AngularJS表单验证中级篇(3)
Sep 28 Javascript
ES6新特性之模块Module用法详解
Apr 01 Javascript
Angular.js指令学习中一些重要属性的用法教程
May 24 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
Sep 11 Javascript
在vue中实现给每个页面顶部设置title
Jul 29 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
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
2013/12/24 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
2016/11/23 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
原生js滑动轮播封装
2020/07/31 Javascript
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
django中嵌套的try-except实例
2020/05/21 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
shell的种类有哪些
2015/04/15 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
函授本科毕业生自我鉴定
2013/10/16 职场文书
校园新闻广播稿
2014/01/10 职场文书
满月酒主持词
2014/03/27 职场文书
三项教育活动实施方案
2014/03/30 职场文书
小学学校评估方案
2014/06/08 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
大客户经理岗位职责
2015/04/09 职场文书
大学班长竞选稿
2015/11/20 职场文书