堆排序

作者: 无敌的肉包 | 来源:发表于2018-07-15 22:53 被阅读0次

    利用Python实现堆排序

    1. 创建最大堆:将堆所有数据重新排序,使其成为最大堆
    2. 最大堆调整:作用是保持最大堆的性质,是创建最大堆的核心子程序
    3. 堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算


    # code from -http://blog.csdn.net/minxihou/article/details/51850001
    import random
    
    def MAX_Heapify(heap,HeapSize,root):#在堆中做结构调整使得父节点的值大于子节点
    
        left = 2*root + 1
        right = left + 1
        larger = root
        if left < HeapSize and heap[larger] < heap[left]:
            larger = left
        if right < HeapSize and heap[larger] < heap[right]:
            larger = right
        if larger != root:#如果做了堆调整则larger的值等于左节点或者右节点的,这个时候做对调值操作
            heap[larger],heap[root] = heap[root],heap[larger]
            MAX_Heapify(heap, HeapSize, larger)
    
    def Build_MAX_Heap(heap):#构造一个堆,将堆中所有数据重新排序
        HeapSize = len(heap)#将堆的长度当独拿出来方便
        for i in xrange((HeapSize -2)//2,-1,-1):#从后往前出数
            MAX_Heapify(heap,HeapSize,i)
    
    def HeapSort(heap):#将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。
        Build_MAX_Heap(heap)
        for i in range(len(heap)-1,-1,-1):
            heap[0],heap[i] = heap[i],heap[0]
            MAX_Heapify(heap, i, 0)
        return heap
    
    if __name__ == '__main__':
        a = [30,50,57,77,62,78,94,80,84]
        print a
        HeapSort(a)
        print a
        b = [random.randint(1,1000) for i in range(1000)]
        #print b
        HeapSort(b)
        print b
    

    相关文章

      网友评论

          本文标题:堆排序

          本文链接:https://www.haomeiwen.com/subject/qfbirftx.html