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 相关文章推荐
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
Nov 11 Javascript
JavaScript对象反射用法实例
Apr 17 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
Dec 29 Javascript
JavaScript开发者必备的10个Sublime Text插件
Feb 27 Javascript
12个非常实用的JavaScript小技巧【推荐】
May 18 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
Feb 13 Javascript
js如何编写简单的ajax方法库
Aug 02 Javascript
vue文件树组件使用详解
Mar 29 Javascript
Vue.js进阶知识点总结
Apr 01 Javascript
security.js实现的RSA加密功能示例
Jun 06 Javascript
通过实例了解JS 连续赋值
Sep 24 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
Jan 27 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
DC动漫人物排行
2020/03/03 欧美动漫
php中文字母数字验证码实现代码
2008/04/25 PHP
php相当简单的分页类
2008/10/02 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
JavaScript内核之基本概念
2011/10/21 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
浅谈js的setInterval事件
2014/12/05 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
js实现右键自定义菜单
2016/12/03 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
微信小程序实现底部导航
2018/11/05 Javascript
详解element-ui中form验证杂记
2019/03/04 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
20多个小事例带你重温ES10新特性(小结)
2019/09/29 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
python监控键盘输入实例代码
2018/02/09 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
python 实现简易的记事本
2020/11/30 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
JAVA高级程序员面试题
2013/09/06 面试题
优质服务演讲稿
2014/05/14 职场文书
2014年外联部工作总结
2014/11/17 职场文书
农业项目合作意向书
2015/05/08 职场文书
红歌会主持词
2015/07/02 职场文书
简历自我评价范文
2019/04/24 职场文书
SpringBoot详解执行过程
2022/07/15 Java/Android