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 设计模式学习 Singleton
Jul 27 Javascript
js parentElement和offsetParent之间的区别
Mar 23 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
Mar 25 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
Jun 07 Javascript
Vue组件BootPage实现简单的分页功能
Sep 12 Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
vue.js实现条件渲染的实例代码
Jun 22 Javascript
基于vue 实现token验证的实例代码
Dec 14 Javascript
JS中使用new Option()实现时间联动效果
Dec 10 Javascript
vue2 拖动排序 vuedraggable组件的实现
Aug 08 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 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 高效率写法 推荐
2010/02/21 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
PHP取进制余数函数代码
2012/01/19 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
Yii学习总结之安装配置
2015/02/22 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
详解js的六大数据类型
2016/12/27 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
彩色的翅膀教学反思
2014/04/25 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
西游降魔篇观后感
2015/06/15 职场文书
运动会100米加油稿
2015/07/21 职场文书
公司人事管理制度
2015/08/05 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python
springboot临时文件存储目录配置方式
2021/07/01 Java/Android
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL