今日目标:

  1. 理解堆(Heap)的基本概念,包括最大堆和最小堆。
  2. 掌握堆的插入、删除和堆排序算法。
  3. 了解堆在优先队列等数据结构中的应用。

1. 堆(Heap)的基本概念

  • 堆是一种特殊的树形数据结构,通常使用数组来实现。
  • 最大堆(Max Heap):父节点的值总是大于或等于其子节点的值。
  • 最小堆(Min Heap):父节点的值总是小于或等于其子节点的值。
  • 堆的根节点(在数组中的第一个元素)是最大值(最大堆)或最小值(最小堆)。

2. 堆的插入

  • 将新元素添加到数组的末尾。
  • 如果新元素比其父节点大(在最大堆中)或小(在最小堆中),则交换它们的位置。
  • 重复此过程,直到新元素满足堆的性质。

3. 堆的删除

  • 通常删除根节点(最大值或最小值)。
  • 将根节点与数组的最后一个元素交换,并删除最后一个元素。
  • 通过“下沉”操作恢复堆的性质:如果根节点的值小于其子节点(在最大堆中)或大于其子节点(在最小堆中),则与较大的子节点(最大堆)或较小的子节点(最小堆)交换位置。
  • 重复此过程,直到根节点满足堆的性质。

4. 堆排序

  • 堆排序是一种基于比较的排序算法,使用堆数据结构。
  • 构建最大堆(或最小堆)。
  • 重复删除根节点并将剩余元素重新调整为堆,直到堆为空。
  • 删除的根节点按照排序顺序放置。

代码实现 (Python 示例 - 最大堆):

python复制代码
 def heapify(arr, n, i):  
 
     largest = i  
 
     left = 2 * i + 1  
 
     right = 2 * i + 2  
 
   
 
     if left < n and arr[i] < arr[left]:  
 
         largest = left  
 
   
 
     if right < n and arr[largest] < arr[right]:  
 
         largest = right  
 
   
 
     if largest != i:  
 
         arr[i], arr[largest] = arr[largest], arr[i]  
 
         heapify(arr, n, largest)  
 
   
 
 def heap_sort(arr):  
 
     n = len(arr)  
 
   
 
     # 构建最大堆  
 
     for i in range(n // 2 - 1, -1, -1):  
 
         heapify(arr, n, i)  
 
   
 
     # 一个个从堆顶取出元素  
 
     for i in range(n - 1, 0, -1):  
 
         arr[i], arr[0] = arr[0], arr[i]  
 
         heapify(arr, i, 0)  
 
   
 
 # 示例数组  
 
 arr = [12, 11, 13, 5, 6, 7]  
 
 heap_sort(arr)  
 
 print("Sorted array is", arr)

注意:

  • 堆排序的时间复杂度是O(n log n),其中n是数组的大小。
  • 堆排序是不稳定的排序算法。

5. 堆的应用

  • 优先队列:堆是实现优先队列的常用数据结构,其中最大堆用于实现最大优先队列,最小堆用于实现最小优先队列。
  • 图算法:堆在诸如Dijkstra的最短路径算法和Prim的最小生成树算法中都有应用。
  • 内存管理:某些内存管理算法使用堆数据结构来管理内存块。

今日总结:

今天学习了堆的基本概念,包括最大堆和最小堆,以及堆的插入、删除和排序算法。通过Python代码示例,实践了最大堆的构建和堆排序算法。此外,还了解了堆在优先队列等数据结构中的应用。堆是一种非常有用的数据结构,特别适用于需要快速查找最大值或最小值以及维护有序集合的场景。