class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
# 调整节点i,使其父亲节点的值大于儿子节点
def heapify(nums, n, i):
# 对于节点i而言,其儿子节点的索引值分别是 2 * i + 1 和 2 * i + 2
if i >= n:
return
idx1 = 2 * i + 1
idx2 = 2 * i + 2
# 找到父亲节点和儿子节点中最大的节点的索引
max_idx = i
if idx1 < n and nums[idx1] > nums[max_idx]:
max_idx = idx1
if idx2 < n and nums[idx2] > nums[max_idx]:
max_idx = idx2
# 如果值最大的节点的索引不等于父亲节点,说明最大节点在儿子节点,交换值,然后递归创建
if max_idx != i:
nums[max_idx], nums[i] = nums[i], nums[max_idx]
heapify(nums, n, max_idx)
# 从最后一个节点的父亲节点开始调整,最后一个节点的索引值为n-1,则父亲节点的索引为 (last_node - 1) // 2。
def build_heap(nums, n):
last_node = n - 1
parent = (last_node - 1) // 2
for i in range(parent, -1, -1):
heapify(nums, n, i)
#主函数 创建
def heap_sort(nums, n):
#创建大根堆
build_heap(nums, n)
# 大根堆的最大的元素是nums[0],将最大元素和最后的一个元素置换,然后调整成堆,i是堆中的元素的个数
for i in range(n-1, -1, -1):
nums[i], nums[0] = nums[0], nums[i]
heapify(nums, i, 0)
n = len(nums)
heap_sort(nums, n)
return nums
一个堆排序的应用:
LC215 数组中的第K个最大元素
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
def heapify(nums, n, i):
if i >= n:
return
idx1 = 2 * i + 1
idx2 = 2 * i + 2
max_idx = i
if idx1 < n and nums[idx1] > nums[max_idx]:
max_idx = idx1
if idx2 < n and nums[idx2] > nums[max_idx]:
max_idx = idx2
if max_idx != i:
nums[max_idx], nums[i] = nums[i], nums[max_idx]
heapify(nums, n, max_idx)
def build_heap(nums, n):
last_node = n - 1
parent = (last_node - 1) // 2
for i in range(parent, -1, -1):
heapify(nums, n, i)
def heap_sort(nums, n, k):
build_heap(nums, n)
res = 0
for i in range(n-1, n-k-1, -1):
res = nums[0]
nums[i], nums[0] = nums[0], nums[i]
heapify(nums, i, 0)
return res
n = len(nums)
return heap_sort(nums, n, k)