堆排序:
数据结构——堆,具有如下性质:
parent(i): math.floor(i/2)
left(i): 2*i
right(i): 2*i+1
堆可分为,最大堆(A[ parent(i) ] >= A[ i ])和最小堆(A[ parent(i) ] <= A[ i ])。一般最大堆用于排序算法,最小堆用于优先队列。
heapSort算法实现:
Max_heapify : 维护最大堆的性质。
Build_Max_heap : 构造最大堆。
把数组转换为最大堆,我们可以认为叶子节点是包含一个元素的堆,因此只需对其他非叶子节点调用Max_heapify。
heapSort : 堆排序(原址)。
首先将数组转化为最大堆,数组中最大值必然为最大堆的堆顶,因此只需A[1]和A[n]对调然后调用Max_heapify,重复这个过程就可实现原址排序。
def buildMaxHeap(arr):
import math
for i in range(math.floor(len(arr)/2),-1,-1):
heapify(arr,i)
def heapify(arr, i):
left = 2*i+1
right = 2*i+2
largest = i
if left < arrLen and arr[left] > arr[largest]:
largest = left
if right < arrLen and arr[right] > arr[largest]:
largest = right
if largest != i:
swap(arr, i, largest)
heapify(arr, largest)
def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i]
def heapSort(arr):
global arrLen
arrLen = len(arr)
buildMaxHeap(arr)
for i in range(len(arr)-1,0,-1):
swap(arr,0,i)
arrLen -=1
heapify(arr, 0)
return arr