1、建立最大堆,根据最大堆将数组从小到大排序
#建立最大堆,是从小到大排序,建立最小堆,是从大到小排序;平均时间复杂度O(nlogn)
def heap_adjust(A,i,size): #将i位置以下调整成最大堆
left = 2*i + 1
right = 2*i + 2
max_pos = i
if left < size and A[max_pos] < A[left]:#将i和其左右孩子将最大的地址存到max_pos
max_pos = left
if right < size and A[max_pos] < A[right]:
max_pos = right
if max_pos != i:
tmp = A[max_pos]
A[max_pos] = A[i]
A[i] = tmp
heap_adjust(A,max_pos,size)
def heap_build(A,size): #建立最大堆建堆从最后倒数第一个非叶子节点开始调整
for i in range(int(size/2),-1,-1):
heap_adjust(A,i,size)
return A
def heap_sorting(A): #利用最大堆排序
size=len(A)
heap_build(A,size)
for i in range(len(A)-1,0,-1):
tmp = A[i]
A[i] = A[0]
A[0] = tmp
heap_adjust(A,0,i)
return A
2、取数组arr中最大的k个数
#平均时间复杂度O(nlogk)
def heap_adjust(A,i, size): #建立k个数的最小堆
left = 2*i + 1
right = 2*i + 2
min_pos = i
if left < size and A[min_pos] > A[left]:
min_pos = left
if right < size and A[min_pos] > A[right]:
min_pos = right
if min_pos != i:
tmp = A[min_pos]
A[min_pos] = A[i]
A[i] = tmp
heap_adjust(A,min_pos,size)
def heap_build(A,size):
for i in range(int(size/2),-1,-1):
heap_adjust(A,i,size)
return A
def heap_maxk(A,k,size): #取最大的k个数
B = heap_build(A[:k],k)
for i in range(k,size):
if A[i] > B[0]:
B[0] = A[i]
heap_adjust(B,0,k)
return B
3、找出数组中第k大的数
#平均时间复杂度O(nlogk)
def heap_adjust(A,i, size): #建立k个数的最小堆
left = 2*i + 1
right = 2*i + 2
min_pos = i
if left < size and A[min_pos] > A[left]:
min_pos = left
if right < size and A[min_pos] > A[right]:
min_pos = right
if min_pos != i:
tmp = A[min_pos]
A[min_pos] = A[i]
A[i] = tmp
heap_adjust(A,min_pos,size)
def heap_build(A,size):
for i in range(int(size/2),-1,-1):
heap_adjust(A,i,size)
return A
def heap_maxk(A,k,size): #取第k大的数
B = heap_build(A[:k],k)
for i in range(k,size):
if A[i] > B[0]:
B[0] = A[i]
heap_adjust(B,0,k)
return B[0]