堆排序的时间复杂度是 O ( n l g n ) O(n\ lg n) O(n lgn),是一种具有空间原址性的排序算法,任何时候都只需要常数个额外的元素空间存储临时数据。
Python 实现代码:
import numpy as np
def parent(i):
return(int((i-1)/2))
def left(i):
return(int(2*i)+1)
def right(i):
return(int(2*i)+2)
def max_heapify(A,i):
l = left(i)
r = right(i)
if l < len(A) and A[l] > A[i]:
largest = l
else:
largest = i
if r < len(A) and A[r] > A[largest]:
largest = r
if largest != i:
t = A[i]
A[i] = A[largest]
A[largest] = t
max_heapify(A,largest)
def build_max_heap(A):
heap_size = len(A)
for i in range(int(heap_size/2)-1,-1,-1):
max_heapify(A,i)
def heapsort(A):
build_max_heap(A)
N = -1
for i in range(len(A)-1,0,-1):
t = A[0]
A[0] = A[i]
A[i] = t
max_heapify(A[0:N],0)
N = N-1
a = [2,3,8,1,1,6,5,8,13,14,15,16,17]
a = np.array(a)
heapsort(a)
print(a)
'''
以下是输出:
[ 1 1 2 3 5 6 8 8 13 14 15 16 17]
'''