一:定义算法
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆排序是一种树形选择排序,在排序过程当中能够把元素当作是一颗彻底二叉树,每一个节点都大(小)于它的两个子节点,当每一个节点都大于等于它的两个子节点时,就称为大顶堆,也叫堆有序; 当每一个节点都小于等于它的两个子节点时,就称为小顶堆。数组
下面是咱们要保存在数组中的堆的形式数据结构
二:堆排序算法性能
1.将长度为n的待排序的数组进行堆有序化构形成一个大顶堆spa
2.将根节点与尾节点交换并输出此时的尾节点设计
3.将剩余的n -1个节点从新进行堆有序化3d
4.重复步骤2,步骤3直至构形成一个有序序列blog
三:如何构造堆(大顶堆)排序
例:{5, 2, 6, 0, 3, 9, 1, 7, 4, 8}get
第一次找到[n/2]处,进行构造:
咱们比较父节点,左右孩子结点的大小,将最大的做为堆顶
第二次,咱们对上次找到位置-1便可,找到结点0,对其左右孩子比较,构造这三个结点的最大堆
第三次,咱们找到结点6,要对其进行构造,结果以下
第四次(重点),咱们不止要构造双亲和左右孩子,咱们还要比较其孩子结点为根的堆是否正确,否则咱们须要进行调整
咱们发现将8,7,2三个结点变为了最大堆,可是其中2,3子树再也不是一个最大堆,咱们须要对其修改
第五次:选取结点9进行构造
发现以结点5为根的子树不是最大堆,咱们须要进行调整
完成构建:
第一步:将最大值和最后的一个元素交换
第二步:将剩余的结点再次进行堆构造
第三步:参照第一步
按照上面循环,最终结果为
五:性能分析
运行时间主要消耗在构造堆和重建堆时的反复筛选上。 构造堆的时间复杂度为O(n) 重建堆时时间复杂度为O(nlogn)。 因此整体就是O(nlogn)。 不适合排序序列个数较少的状况