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 复制或插入Html的实现方法小结
May 19 Javascript
jQuery UI AutoComplete 自动完成使用小记
Aug 21 Javascript
JavaScript 设计模式 安全沙箱模式
Sep 24 Javascript
jquery.validate分组验证代码
Mar 17 Javascript
禁用JavaScript控制台调试的方法
Mar 07 Javascript
JavaScript数值转换的三种方式总结
Jul 31 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
Mar 27 Javascript
jQuery插件jRumble实现网页元素抖动
Jun 05 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
May 05 Javascript
WebStorm ES6 语法支持设置&amp;babel使用及自动编译(详解)
Sep 08 Javascript
JavaScript一元正号运算符示例代码
Jun 30 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
在PHP中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
php使用ICQ网关发送手机短信
2013/10/30 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
中止javascript执行的方法
2014/02/14 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
学校募捐倡议书
2014/05/14 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
学校政风行风评议心得体会
2014/10/21 职场文书
新郎结婚保证书
2015/02/26 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
Python 制作自动化翻译工具
2021/04/25 Python