。
在堆排序算法中,我们使用了完全二叉树的性质来构建堆(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]
- 构建初始堆(大顶堆)
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]
希望这个图例能够帮助你更好地理解堆排序算法中,利用完全二叉树的性质来构建堆并进行排序。