排序算法-(7)堆排序
2018-08-21 05:30:03来源:博客园 阅读 ()
堆排序
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:
同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子
该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
详细步骤和原理可以看这篇:https://www.cnblogs.com/chengxiao/p/6129630.html
代码实现
//重新调整为大顶堆 function _heapify(arr, size, index) { let largest = index; const left = 2 * index + 1; const right = 2 * index + 2; if (left < size && arr[left] > arr[largest]) { largest = left; } if (right < size && arr[right] > arr[largest]) { largest = right; } if (largest !== index) { [arr[index], arr[largest]] = [arr[largest], arr[index]]; _heapify(arr, size, largest); } } //这里的堆排序用的是最大堆 function heapSort(arr) { const result = arr.slice(0); const size = arr.length; for (let i = Math.floor(size / 2 - 1); i >= 0; i--) { _heapify(result, size, i); } for (let i = size - 1; i >= 0; i--) { [result[0], result[i]] = [result[i], result[0]]; _heapify(result, i, 0); } return result; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:js-完整轮播图
- 如何用算法删除重复数据 2020-03-18
- Javascript排序算法的介绍 2019-10-29
- JavaScript知识点:分支结构(if、switch)+算法例题 2019-08-14
- 前端笔记之React(四)生命周期&Virtual DOM和Diff 2019-08-14
- 前端笔记之Vue(六)分页排序|酷表单实战&Vue-cli 2019-05-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash