堆是一种特殊的树形数据结构,它满足以下两个性质:
- 完全二叉树:堆是一棵完全二叉树,即除了最底层之外,其他每一层的节点都被完全填满,且最底层的节点都尽可能地集中在左侧。
- 堆属性:对于最大堆(大顶堆)来说,父节点的值总是大于或等于任何一个子节点的值;对于最小堆(小顶堆)来说,父节点的值总是小于或等于任何一个子节点的值。
堆排序是一种利用堆这种数据结构来进行排序的算法。它的基本思想是先将待排序的数组构造成一个最大堆(或最小堆),然后依次将堆顶元素(最大值或最小值)取出,再对剩余的元素重新构造堆,如此往复直至完成排序。
堆排序的具体步骤如下:
- 构建堆:将待排序的数组看成是一个完全二叉树的结构,从最后一个非叶子节点开始(索引为n/2-1),自底向上地调整,使得每个父节点的值都大于其子节点的值(最大堆)或小于其子节点的值(最小堆)。
- 排序:将堆顶元素(最大值或最小值)与数组末尾元素交换,然后将剩余部分重新调整为堆,再次取出堆顶元素,如此往复直至完成排序。
堆排序的时间复杂度为O(nlogn),其中n为待排序数组的长度。虽然堆排序在最坏情况下和平均情况下的时间复杂度都为O(nlogn),但由于其数据访问方式的局部性,它通常比快速排序慢,因此在实际应用中并不常用于普通数据排序,但是在一些特定场景下仍然具有一定的价值。
总的来说,堆排序是利用堆这种数据结构来进行排序的一种高效算法,通过构建堆和反复调整堆的过程来完成排序,其时间复杂度为O(nlogn),是一种稳定且适用于大规模数据排序的算法。
标签:排序,复杂度,堆排序,二叉树,nlogn,节点 From: https://blog.51cto.com/u_16161880/8469624