以大根堆为例,堆排序分为两个步骤:
一是将杂乱的数组构建成大根堆,此部分是自下而上的时间复杂度为O(n),从最后一个根节点开始,依次向前;
二是为了最终返回的数组是排好序的,需要不断将大跟堆的根与当前的堆的最后一个元素交换,并将交换后的堆重新调整成大根堆。此部分是自上而下的,时间复杂度与树的高度有关,为O(logn)。
无论是哪一个步骤,其中最重要的环节,就是自上而下的调整堆,因此在类中写一个adjust函数实现调整堆,将非堆的树调整成大根堆,在主函数中不断调用这个函数。
然后在主函数中,第一个for循环实现构建堆;第二个for循环实现堆排序。
array=[0,95,76,66,50,36,12,25,36]
class heapsort(object):
def __init__(self,array):
self.array=array
def adjust(self,start,n):
temp=self.array[start]
j=2*start
while(j<=n):
if j<n and self.array[j]<self.array[j+1]:
j+=1
if(self.array[j]>temp):
self.array[start]=self.array[j]
start=j
j=2*start
else:
break
self.array[start]=temp
def sort(self):
n=len(self.array)-1
for i in range(n//2,0,-1):#构建堆
self.adjust(i,n)
for i in range(n,1,-1):
self.array[1],self.array[i]=self.array[i],self.array[1]
self.adjust(1,i-1)
heapsort(array).sort()