堆排序+代码实现

简介: 堆,heap,是二叉树的一种。小根堆有这样的性质——任意一个结点的值比它的左右孩子都要小。排序思想将待排元素看作是完全二叉树,物理上用一维数组存储。
**堆排序** 堆,heap,是二叉树的一种。小根堆有这样的性质——任意一个结点的值比它的左右孩子都要小。 ##排序思想 将待排元素看作是完全二叉树,物理上用一维数组存储。 **实现堆排序需要解决两个问题:** 1.如何将杂乱的完全二叉树初始化为一个堆? 答:从最后一个非叶结点起,将该节点当做根,自上而下进行调整,使之成为一个堆。然后依次对倒数第二个、倒数第三个、直至正数第一个结点进行此操作。 2.输出堆顶元素后,如何将余下的元素调整为一个堆? 答:将最后一个结点放在原根结点位置上,以它为根进行上述的调整。 ##复杂度分析。 二叉树的层数计算方法,从上往下,1,2,3,4...... 耗时的操作有构造初始堆和调整堆两部分。 对深度为h的堆进行自上而下的调整,最多比较次数为2*(h-1)。 在初始化堆的过程中,完全二叉树的高度为h,总的比较次数为 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/5f380587b03e460eb66c3f01d93b8e77.png) 综上,堆排序在复杂度最坏的情况下为O((1)式+(2)式)=O(n*logn)。 ##代码 初始序列为`1 8 6 2 5 4 7 3`一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:A A.8 3 2 5 1 6 4 7  B.3 2 8 5 1 4 6 7  C.3 8 2 5 1 6 7 4  D.8 2 3 5 1 4 7 6 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/be6f730e450c4111aaad29753a8b66fa.png)
目录
相关文章
|
3月前
|
存储 算法 C语言
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
29 0
|
算法 C语言 C++
【双指针问题】LeetCode344、345、 844、283问题详解及代码实现
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
75 0
|
4月前
|
搜索推荐 Java
java实现冒泡排序和快速排序代码
java实现冒泡排序和快速排序
42 1
|
4月前
|
算法 Java C++
归并排序代码实现
归并排序代码实现
28 0
|
4月前
|
人工智能 供应链 搜索推荐
①归并排序、快速排序 、堆排序、计数排序[算法、代码模板、面试题]
①归并排序、快速排序 、堆排序、计数排序[算法、代码模板、面试题]
71 0
|
存储
图解:非递归实现快速排序
方法的调用实际是使用了方法调用栈。递归不就是方法调用本身就是入栈和出栈的过程吗。如果是这样的话,我们就可以使用栈来替换之前的递归,在栈中存储方法每次传入的参数即可。
117 0
图解:非递归实现快速排序
|
算法 C语言 C++
【双指针问题】LeetCode:392、3、11问题详解及代码实现
本篇总结过去一周内遇到双指针问题。
109 0
|
算法 搜索推荐
【排序算法】5行代码实现冒泡排序
【排序算法】5行代码实现冒泡排序