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 相关文章推荐
javascript的键盘控制事件说明
Apr 15 Javascript
利用JQuery为搜索栏增加tag提示
Jun 22 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
Mar 05 Javascript
基于javascript的Form表单验证
Dec 29 Javascript
vue.js+Echarts开发图表放大缩小功能实例
Jun 09 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
Aug 28 Javascript
vue实现选项卡及选项卡切换效果
Apr 24 Javascript
原生JS实现$.param() 函数的方法
Aug 10 Javascript
vue 路由守卫(导航守卫)及其具体使用
Feb 25 Javascript
详解JS数组方法
Nov 20 Javascript
VUE递归树形实现多级列表
Jul 15 Vue.js
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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
php判断当前操作系统类型
2015/10/28 PHP
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
JavaScript中的比较操作符&gt;、=、
2014/12/31 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
package.json文件配置详解
2017/06/15 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
TensorFlow实现卷积神经网络CNN
2018/03/09 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
查看Django和flask版本的方法
2018/05/14 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
Python3多线程基础知识点
2019/02/19 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
Python异常处理例题整理
2019/07/07 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
制药工程专业应届生求职信
2013/09/24 职场文书
《雷雨》教学反思
2014/02/20 职场文书
委托培训协议书
2014/11/17 职场文书
行政处罚听证告知书
2015/07/01 职场文书
《正比例》教学反思
2016/02/23 职场文书
晚会开幕词范文
2016/03/04 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
pandas数值排序的实现实例
2021/07/25 Python