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 相关文章推荐
jquery zTree异步加载简单实例分享
Feb 05 Javascript
鼠标放在图片上显示大图的JS代码
Mar 26 Javascript
js实现表格字段排序
Feb 19 Javascript
js实现按钮颜色渐变动画效果
Aug 20 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
Aug 28 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
Sep 08 Javascript
JavaScript获取select中text值的方法
Feb 13 Javascript
javascript 面向对象function详解及实例代码
Feb 28 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
Apr 29 jQuery
Angular2开发环境搭建教程之VS Code
Dec 15 Javascript
js继承的这6种方式!(上)
Apr 23 Javascript
jQuery控制input只能输入数字和两位小数的方法
May 16 jQuery
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/05/29 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
Python简单进程锁代码实例
2015/04/27 Python
详解Python中time()方法的使用的教程
2015/05/22 Python
python实现基本进制转换的方法
2015/07/11 Python
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
Python 用三行代码提取PDF表格数据
2019/10/13 Python
Python: 传递列表副本方式
2019/12/19 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
Django返回HTML文件的实现方法
2020/09/17 Python
python Xpath语法的使用
2020/11/26 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
总经理的岗位职责
2014/02/23 职场文书
海洋科学专业求职信
2014/08/10 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
航班延误投诉信
2015/07/02 职场文书
导游词之桂林
2019/08/20 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL
Python中的嵌套循环详情
2022/03/23 Python