目录
2、不断调整重建大顶堆,堆顶元素和末尾元素进行交换,得到最大值下沉到数组末端
一、堆的相关概念
堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆排序是利用堆这种数据结构而设计的一种排序算法,下面着重介绍一下堆的相关概念。直接借鉴百度百科。
所以堆首先是一颗完全二叉树。
每个结点的值都大于或等于其左右孩子结点的值,称为大根堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。
每个结点的值都小于或等于其左右孩子结点的值,称为小根堆。
二、堆排序动图
三、堆排序思路
将无序序列构建成一个堆,根据升序降序需求选择大根堆或小根堆。
将堆顶元素和末尾元素交换,将最大元素“沉”到数组末端。
重新调整结构,使其满足堆定义,然后继续交换堆顶元素和当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。
说实话,找了好几篇帖子才看懂一点,另外我觉得堆排序似乎是“选泡插,快归堆希桶计基; 恩方恩老恩一三,对恩加K恩乘K。 选快堆希都不稳(ps:时常背口诀haha)中最复杂的,下面的思路都是建立的大根堆。
以数组[3,7,8,20,16,17]为例子,总所周知,数组和二叉树是可以相互转化的,堆是作为二叉树的一种典型数据结构。
首先明确很重要的一点就是整个排序过程中,并没有真正创建过树,整个过程中,其实都是在对数组进行操作。在对数组操作的时候,是以大顶堆其中的规则来进行操作的。
1、 建立逻辑上的大顶堆
2、不断调整重建大顶堆,堆顶元素和末尾元素进行交换,得到最大值下沉到数组末端