def heapify(arr, n, i):
largest = i # 初始化最大为根
l = 2 * i + 1 # 左 = 2*i + 1
r = 2 * i + 2 # 右 = 2*i + 2
# 如果左子节点大于根
if l < n and arr[l] > arr[largest]:
largest = l
# 如果右子节点大于目前的最大值
if r < n and arr[r] > arr[largest]:
largest = r
# 如果最大值不是根
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i] # 交换
# 递归地堆化受影响的子树
heapify(arr, n, largest)
def heapSort(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]
heapSort(arr)
n = len(arr)
print("排序后的数组是")
for i in range(n):
print("%d" % arr[i], end=" ")
这段代码实现了堆排序算法。堆排序是一种基于比较的排序技术,通过构建二叉堆(通常为最大堆)来对元素进行排序。首先,它将数组元素重新排列成一个最大堆。此时,整个数组的最大值就是堆顶的根节点。将它与堆数组的末尾元素进行交换,此时末尾就是最大值。然后将剩余的n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序数组了。