学习目标:

  1. 掌握堆(Heap)的基本概念及性质。
  2. 实现堆的基本操作,如插入、删除等。
  3. 理解堆排序算法的原理和步骤。
  4. 实现堆排序算法。

学习内容:

1. 堆的基本概念

  • 堆是一种特殊的完全二叉树,其每个父节点的值都大于或等于(对于最大堆)或小于或等于(对于最小堆)其子节点的值。
  • 堆通常用数组来表示,数组中的每个元素都有一个父节点和两个子节点(对于非叶子节点)。
  • 堆的两种类型:最大堆和最小堆。

2. 堆的性质

  • 完全二叉树:堆总是一棵完全二叉树,这意味着除了最底层之外,其他层的节点都是满的,且最底层从左到右填充。
  • 堆序性质:对于每个节点,其值都满足最大堆或最小堆的条件。

3. 堆的基本操作

  • 插入:将新元素添加到数组的末尾,然后上浮(Heapify)以保持堆的性质。
  • 删除:删除堆顶元素(最大或最小元素),然后将最后一个元素移到堆顶,并进行下沉操作以保持堆的性质。

4. 堆排序算法

  • 堆排序是一种基于堆的数据结构进行的排序算法。
  • 首先,构建一个最大堆(或最小堆)。
  • 然后,交换堆顶元素和最后一个元素,删除堆顶元素,并调整剩余元素以恢复堆的性质。
  • 重复上述步骤,直到堆为空。

代码实现:

堆的基本操作(Python代码)

python复制代码
 def heapify(arr, n, i, is_max_heap=True):  
 
     largest = i  # Initialize largest as root  
 
     left = 2 * i + 1  
 
     right = 2 * i + 2  
 
   
 
     # If left child is larger than root  
 
     if left < n and (is_max_heap and arr[i] < arr[left] or not is_max_heap and arr[i] > arr[left]):  
 
         largest = left  
 
   
 
     # If right child is larger than largest so far  
 
     if right < n and (is_max_heap and arr[largest] < arr[right] or not is_max_heap and arr[largest] > arr[right]):  
 
         largest = right  
 
   
 
     # If largest is not root  
 
     if largest != i:  
 
         arr[i], arr[largest] = arr[largest], arr[i]  # swap  
 
   
 
         # Heapify the root.  
 
         heapify(arr, n, largest, is_max_heap)  
 
   
 
 def heap_sort(arr, is_max_heap=True):  
 
     n = len(arr)  
 
   
 
     # Build a maxheap.  
 
     for i in range(n, -1, -1):  
 
         heapify(arr, n, i, is_max_heap)  
 
   
 
     # One by one extract elements  
 
     for i in range(n-1, 0, -1):  
 
         arr[i], arr[0] = arr[0], arr[i]  # swap  
 
         heapify(arr, i, 0, is_max_heap)  
 
   
 
 # Example usage:  
 
 arr = [12, 11, 13, 5, 6, 7]  
 
 heap_sort(arr)  
 
 print("Sorted array is", arr)

学习心得:

  • 堆排序是一种高效的排序算法,其时间复杂度为O(nlogn)。
  • 通过今天的学习,我掌握了堆的基本概念和性质,并成功实现了堆排序算法。
  • 堆在实际应用中也有很多用途,比如优先级队列、Dijkstra算法等。

接下来的学习计划:

  • 深入学习堆的应用场景,如优先级队列的实现。
  • 学习其他排序算法,如归并排序、快速排序等。
  • 开始学习图论相关知识,如图的表示、遍历等。