堆排序-python实现

589 阅读1分钟

以大根堆为例,堆排序分为两个步骤:

一是将杂乱的数组构建成大根堆,此部分是自下而上的时间复杂度为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()