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 相关文章推荐
ie支持function.bind()方法实现代码
Dec 27 Javascript
JavaScript:Div层拖动效果实例代码
Aug 06 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
Aug 29 Javascript
JS获取多维数组中相同键的值实现方法示例
Jan 06 Javascript
js实现固定宽高滑动轮播图效果
Jan 13 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
Jan 22 Javascript
Angular中ng-bind和ng-model的区别实例详解
Apr 10 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
Dec 13 Javascript
vue单页缓存方案分析及实现
Sep 25 Javascript
Vue性能优化的方法
Jul 30 Javascript
js实现网页随机验证码
Oct 19 Javascript
一文彻底理解js原生语法prototype,__proto__和constructor
Oct 24 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一些错误处理的方法与技巧总结
2013/08/10 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
PHP7 其他修改
2021/03/09 PHP
js控制table合并具体实现
2014/02/20 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
vue+vant实现购物车全选和反选功能
2020/11/17 Vue.js
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
Python的类实例属性访问规则探讨
2015/01/30 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
深入理解Python装饰器
2016/07/27 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
Python多线程扫描端口代码示例
2018/02/09 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
策划创业计划书
2014/02/06 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
地球一小时活动总结
2015/02/27 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS