Python 堆排序实现的算法?
参考答案:
堆排序是一种基于二叉堆的排序算法,它的时间复杂度为O(nlogn),具有不稳定性和原地排序的特性。以下是一个Python实现的堆排序算法:
def heapify(arr, n, i):
largest = i # Initialize largest as root
l = 2 * i + 1 # left = 2*i + 1
r = 2 * i + 2 # right = 2*i + 2
# Check if left child of root exists and is greater than root
if l < n and arr[i] < arr[l]:
largest = l
# Check if right child of root exists and is greater than root
if r < n and arr[largest] < arr[r]:
largest = r
# Change root, if needed
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i] # swap
# Heapify the root.
heapify(arr, n, largest)
def heapSort(arr):
n = len(arr)
# Build a maxheap.
for i in range(n, -1, -1):
heapify(arr, n, i)
# 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)
# Test the function
arr = [12, 11, 13, 5, 6, 7]
heapSort(arr)
n = len(arr)
print("Sorted array is")
for i in range(n):
print("%d" %arr[i]),
上述代码中,heapify
函数负责保持堆的特性(即父节点的值大于或等于其子节点的值),而heapSort
函数首先构建一个最大堆,然后交换堆顶元素和最后一个元素,并重新对剩下的元素进行堆化,这样最大值就被放到了数组的最后。重复这个过程,就可以得到排序后的数组。
需要注意的是,这个堆排序实现的是降序排序,如果你想进行升序排序,你需要在heapify
函数中对largest
的判断进行相应的调整。