| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 排序算法——堆排序 -> 正文阅读 |
|
[数据结构与算法]排序算法——堆排序 |
目录 学习堆排序之前,先回顾以下概念: 1??概念回顾二叉树:二叉树是指树中节点的度不大于2的有序树。 (节点的度:一个节点拥有子树的数目称为节点的度) (分枝结点: 度不为0的结点) 完全二叉树:完全二叉树是指:二叉树上每一层都是满的,或者最后一层没填满并且最后一层的叶子节点集中在树的左部。 例如:
大根堆每个结点的值都大于等于其左、右孩子的值。 ? 小根堆每个结点的值都小于等于其左、右孩子的值。 ?2??堆排序堆排序使用的是二叉堆的概念,二叉堆是一颗完全二叉树。
?基本介绍:堆排序是利用堆这种数据结构所设计的一种排序算法。 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。 升序采用大顶堆,降序采用小顶堆。 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 算法思想:1、将无序序列构建成一个堆,根据升序降序需求选择大根堆或小根堆 2、将调整后的堆顶元素与末尾元素进行交换,将最大元素“沉”到数组末端。 3、将剩下元素重新构造成一个堆,继续进行调整,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。
实例:对数组[7,4,3,2,8,0,1,6,9]进行堆排序,升序排序。 思路步骤:1、先将数组构建成一个堆 ? 2、调整为大根堆的形式: 找最后一个非叶子节点:(arr.length-1-1)/2=7/2=3,下标为3 的节点为2 故先将[2,6,9]调整为大根堆形式: ?3、接下来该调整节点3 ,发现已经是大根堆形式;所以,开始调节节点4。 ?
?4、接下来调整堆顶元素 ?5、将调整完成之后的堆顶元素与末尾元素进行交换,对剩余元素重复以上步骤,直至整个序列有序。 ?每一轮完成之后,都会将本轮中最大的元素“沉”到数组末端。可以看到在构建大顶堆的过程中,元素的个数逐渐减少,最后就会得到一个有序序列. 代码实现:
运行结果: 算法性能分析:(1)平均时间复杂度:O() (2)空间复杂度: O(1) (3)稳定性: 不稳定 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 23:51:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |