| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 11堆排序 -> 正文阅读 |
|
[数据结构与算法]11堆排序 |
https://blog.csdn.net/weixin_45796387/article/details/114994648?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162509768116780274190983%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162509768116780274190983&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-114994648.first_rank_v2_pc_rank_v29&utm_term=%E4%BA%8C%E5%8F%89%E6%A0%91&spm=1018.2226.3001.4187 ————————二叉树详解 堆排序1.简介堆的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序,下面先来看看什么是大根堆和小根堆 条件: 1.首先是一个完全二叉树 2.父节点的值大于子节点 2.大根堆和小根堆性质:每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆;每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。 ? 我们对上面的图中每个数都进行了标记,上面的结构映射成数组就变成了下面这个样子。 还有一个基本概念:查找数组中某个数的父结点和左右孩子结点,比如已知索引为****i****的数,那么。 1.parent: (i - 1) / 2; 2.child1: 2**i*+1 3.child2: 2**i*+2 3.大堆排序基本思想: ? 1.首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端 ? 2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1 ? 3.将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组 4.实现步骤1.大根堆思路:从0 到n个节点都需要做一次小堆,三个数进行比较,取最大值,放到三个数顶端,三个数的顶端需要和parent节点比较,直到小于等于0时释放.
2.每次末尾的数与第一个数交换
3.堆排序的事件复杂度nlgn: 4.堆应用场景从10万个数里面选出最小的10个”为例,利用堆排序从无序数组里面选择最大(小)的部分元素。 实现原理:用个无序数组模拟10万个数,取无序数组里面前面的10个数字构建一个大顶堆,从第11个数开始逐个与堆顶元素进行比较,小于堆顶元素则入堆,并重新构建大顶堆,这样能保证堆顶元素始终是最大的。循环完毕之后,堆里面的10个元素就是最小的了。 如果采用堆来实现,则非常容易取到值,取最大元素。 第一次堆:大顶堆堆顶就是最大值,n次 第二次堆:先把顶端元素与最后的元素交换。再次进行大顶堆 第三次堆:… 也就是,需要的次数非常快。 5.总结使用场景
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:43:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |