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 相关文章推荐
Array.slice()与Array.splice()的返回值类型
Oct 09 Javascript
Javascript 键盘事件的组合使用实现代码
May 04 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
May 24 Javascript
jQuery中[attribute=value]选择器用法实例
Dec 31 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
Oct 23 Javascript
干货分享:让你分分钟学会javascript闭包
Dec 25 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
Oct 13 Javascript
bootstrap table支持高度百分比的实例代码
Feb 28 Javascript
JavaScript实现图片懒加载的方法分析
Jul 05 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
Jan 30 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 Javascript
vue实现放大镜效果
Sep 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 文章中的远程图片采集到本地的代码
2009/07/30 PHP
php获取操作系统语言代码
2013/11/04 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
Jquery中给animation加更多的运作效果实例
2013/09/05 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
用实例分析Python中method的参数传递过程
2015/04/02 Python
Flask数据库迁移简单介绍
2017/10/24 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
Python实现搜索算法的实例代码
2020/01/02 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
保安拾金不昧表扬信
2014/01/15 职场文书
迎七一演讲稿
2014/09/12 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书