arr = [2,5,4,2,1,22,4,5,3,87,3,22]
def adjustHeap(arr,length,i): # 调整新添加arr[i]元素后,继续调整为大根堆
temp = arr[i] # 将arr[i]存入temp
k = 2*i + 1 # 从孩子中进行搜索
while k < length:
if k+1 < length and arr[k+1] > arr[k]: # 将k指向孩子中较大的结点
k += 1
if arr[k] > temp: # 孩子结点中最大的元素比arr[i]大的话,将孩子结点向上抛
arr[i] = arr[k]
i = k
else: # 孩子结点最大的元素比arr[i]小,则为大根堆,不必调整
break
k = 2*k + 1 # 继续向下搜索
arr[i] = temp
def sort_arr(arr):
n = len(arr)
for i in range(int(n/2)-1,-1,-1): # 从下至上依次遍历所以叶子结点,最终调整为大根堆
adjustHeap(arr,n,i)
for j in range(n-1,0,-1): # 从后至前依次将数组元素arr[k]与arr[0]进行交换,并将[0,k-1]调整为大根堆
arr[0],arr[j] = arr[j],arr[0]
adjustHeap(arr,j,0)
return arr
sort_arr(arr)
运行结果:
[1, 2, 2, 3, 3, 4, 4, 5, 5, 22, 22, 87]