数据结构与算法之数据结构 堆面试高频 堆排序 / 优先队列

数据结构与算法阿木 发布于 2025-07-11 6 次阅读


摘要:堆(Heap)是一种特殊的数据结构,它是一种近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或大于)它的父节点。堆常用于实现优先队列,以及堆排序算法。本文将深入浅出地介绍堆数据结构,并探讨其在排序和优先队列中的应用。

一、堆的定义与性质

1. 定义

堆是一种特殊的完全二叉树,它满足以下性质:

(1)堆分为大顶堆和小顶堆,大顶堆的每个父节点的值都大于或等于其子节点的值;小顶堆的每个父节点的值都小于或等于其子节点的值。

(2)堆的顺序可以是任意顺序,但通常按照层序遍历的顺序进行。

2. 性质

(1)堆的父节点与子节点之间的关系:对于任意节点i(i > 1),其父节点为i/2,左子节点为2i,右子节点为2i+1。

(2)堆的插入和删除操作具有O(logn)的时间复杂度。

二、堆的构建

1. 堆的构建方法

(1)从完全二叉树的最后一个非叶子节点开始,逐个向上调整,使其满足堆的性质。

(2)从完全二叉树的第一个节点开始,逐个向下调整,使其满足堆的性质。

2. 代码实现

python

def heapify(arr, n, i):


largest = i


l = 2 i + 1


r = 2 i + 2

if l < n and arr[i] < arr[l]:


largest = l

if r < n and arr[largest] < arr[r]:


largest = r

if largest != i:


arr[i], arr[largest] = arr[largest], arr[i]


heapify(arr, n, largest)

def build_heap(arr):


n = len(arr)

for i in range(n // 2 - 1, -1, -1):


heapify(arr, n, i)


三、堆排序

1. 堆排序的基本思想

堆排序是一种基于比较的排序算法,其基本思想是:

(1)将待排序的序列构造成一个大顶堆。

(2)将堆顶元素(最大值)与最后一个元素交换,然后调整剩余元素,使其满足堆的性质。

(3)重复步骤(2),直到堆中只剩下一个元素。

2. 代码实现

python

def heap_sort(arr):


n = len(arr)

build_heap(arr)

for i in range(n - 1, 0, -1):


arr[i], arr[0] = arr[0], arr[i]


heapify(arr, i, 0)


四、堆在优先队列中的应用

1. 优先队列的定义

优先队列是一种特殊的队列,它允许用户以某种顺序访问队列中的元素。在优先队列中,元素按照优先级排序,优先级高的元素先被访问。

2. 堆在优先队列中的应用

堆可以用来实现优先队列,具体方法如下:

(1)将元素插入堆中,元素按照优先级排序。

(2)从堆中取出优先级最高的元素。

(3)重复步骤(2),直到堆为空。

3. 代码实现

python

def insert_heap(heap, element):


heap.append(element)


i = len(heap) - 1


while i > 0:


parent = (i - 1) // 2


if heap[parent] < heap[i]:


heap[parent], heap[i] = heap[i], heap[parent]


i = parent


else:


break

def extract_max(heap):


if len(heap) == 0:


return None


max_element = heap[0]


heap[0] = heap[-1]


heap.pop()


heapify(heap, len(heap), 0)


return max_element


五、总结

堆是一种高效的数据结构,在排序和优先队列中有着广泛的应用。本文介绍了堆的定义、性质、构建方法、堆排序以及堆在优先队列中的应用。通过学习本文,读者可以更好地理解堆数据结构,并将其应用于实际编程中。

(注:本文约3000字,实际字数可能因排版和编辑而有所不同。)