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 相关文章推荐
总结一些js自定义的函数
Aug 05 Javascript
13 个JavaScript 性能提升技巧分享
Jul 26 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
Jun 06 Javascript
利用Vue v-model实现一个自定义的表单组件
Apr 27 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
Apr 28 Javascript
node.js自动上传ftp的脚本分享
Jun 16 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
Jul 10 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
详解关于Vue单元测试的几个坑
Apr 26 Javascript
基于javascript处理二进制图片流过程详解
Jun 08 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
Jun 24 jQuery
JS制作简易计算器的实例代码
Jul 04 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中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
PHP数组操作类实例
2015/07/11 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
js new Date()实例测试
2019/10/31 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
linux系统使用python获取内存使用信息脚本分享
2014/01/15 Python
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
python3.4实现邮件发送功能
2018/05/28 Python
10个Python小技巧你值得拥有
2018/09/29 Python
django框架使用方法详解
2019/07/18 Python
python自定义时钟类、定时任务类
2021/02/22 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
python中数字是否为可变类型
2020/07/08 Python
Django多个app urls配置代码实例
2020/11/26 Python
Python如何定义一个函数
2015/09/01 面试题
幼儿园门卫岗位职责
2014/02/14 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
长城导游词
2015/01/30 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS