程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

python3算法-使用完全二叉树的性质来实现堆排序

balukai 2025-02-13 11:03:41 文章精选 16 ℃

在堆排序算法中,我们使用了完全二叉树的性质来构建堆(Heap)。堆是一种特殊的树状数据结构,它满足以下两个性质:

  • 堆的结构性质:堆是一棵完全二叉树,即除了最后一层外,其他层的节点都是满的,最后一层的节点从左到右连续排列。
  • 堆的堆序性质:对于大顶堆(Max Heap)来说,每个节点的值都大于或等于其子节点的值;对于小顶堆(Min Heap)来说,每个节点的值都小于或等于其子节点的值。

堆排序算法的核心思想是通过构建堆来实现排序。首先,我们将待排序的元素构建成一个初始堆,然后将堆顶元素与最后一个元素交换,并重新调整堆,使得剩余元素继续满足堆的性质。重复这个过程,直到所有元素都排好序。

下面是一个使用Python实现堆排序算法的示例代码:

# 构建大顶堆
def build_max_heap(arr):
    n = len(arr)
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

# 调整堆
def heapify(arr, n, i):
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2

    if left < n and arr[left] > arr[largest]:
        largest = left

    if right < n and arr[right] > arr[largest]:
        largest = right

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

# 堆排序
def heap_sort(arr):
    n = len(arr)
    build_max_heap(arr)
    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("排序后的数组:")
for i in range(len(arr)):
    print(arr[i])
Plain Text

在上述示例中,我们首先定义了build_max_heap函数来构建大顶堆,然后定义了heapify函数来调整堆。最后,我们使用heap_sort函数实现堆排序。

希望这个示例能够帮助你理解如何使用Python实现堆排序算法,并且了解堆排序中利用完全二叉树的性质来构建堆的过程。


当然,请看以下堆排序的图例示例

初始数组:[12, 11, 13, 5, 6, 7]

  1. 构建初始堆(大顶堆)
         12
       /    \
     11      13
    /  \    /
   5    6  7

2.第一次交换堆顶元素和最后一个元素

         7
       /    \
     11      13
    /  \    /
   5    6  12

3.调整堆,使其重新满足堆的性质

         13
       /    \
     11      12
    /  \    /
   5    6  7

4.第二次交换堆顶元素和倒数第二个元素

         6
       /    \
     11      12
    /  \    /
   5    7  13

5.调整堆

         12
       /    \
     11      13
    /  \    /
   5    7  6

6.第三次交换堆顶元素和倒数第三个元素

         5
       /    \
     11      13
    /  \    /
   12   7  6

7.调整堆

         13
       /    \
     11      6
    /  \    /
   12   7  5

8.第四次交换堆顶元素和倒数第四个元素

         5
       /    \
     11      6
    /  \    /
   13   7  12

9.调整堆

         11
       /    \
     13      6
    /  \    /
   5    7  12

10第五次交换堆顶元素和倒数第五个元素:

          6
       /    \
     13      11
    /  \    /
   5    7  12

11.调整堆:

         13
       /    \
     6      11
    /  \    /
   5    7  12

最终排序结果:[5, 6, 7, 11, 12, 13]

希望这个图例能够帮助你更好地理解堆排序算法中,利用完全二叉树的性质来构建堆并进行排序。

最近发表
标签列表