排序算法二 堆排序

堆排序的时间复杂度为:O(nlgn)


def max_heapify(lst,start,end):
    '''
    创建最大堆
    '''
    root = start 
    while True:
        child = 2 * root + 1   #左孩子 
        if child > end:
            break
        if child + 1 <= end and lst[child] <lst[child + 1]:
            child += 1
        if lst[root] < lst[child]:
            lst[root],lst[child] = lst[child],lst[root]
            root = child
        else:
            break

def heap_sort(lst):
    first = len(lst)
    for start in range(first,-1,-1):
        max_heapify(lst,start,len(lst)-1)
    for end in range(len(lst) - 1 , 0,-1):
        lst[0],lst[end] = lst[end],lst[0]
        max_heapify(lst,0,end - 1)
    return lst

def main():
    A = [5,3,17,10,84,19,6,22,9]
    print heap_sort(A)
    
if __name__ == '__main__':
    main()

堆数据对象是一种数组对象,它可以看作一颗完全二叉树。
对于一个堆数组A,有两个属性:
1.length[A]:表示数组中元素的个数
2.heap-size[A]:表示数组A中存放的堆元素的个数

树的根为A[1],给定某个结点的下标为i,则
父节点:parent[i] : i/2向上取整
左儿子:left[i]:2i
右儿子:right[i]:2i+1

堆分为:最大堆和最小堆
在堆排序中我们使用最大堆,最小堆一般用于构造优先队列。

堆的一个节点的高度:该节点到叶节点最长简单路径上边的数目
一个包含n个元素的堆的高度为O(lgn)

维护堆性质 MAX-HEAPIFY

在这里插入图片描述
MAX-HEAPIFY用于维护最大堆。他的输入为一个数组A和一个下标i。在调用MAX-HEAPIFY的时候,我们假设LEFT(i)和RIGHT(i)的二叉树都是最大堆,但这时候的A[i]有可能小于他的孩子节点。MAX-HEAPIFY就是让A[i]的值在最大堆中逐级下降,从而使得根节点为下标i的字数重新遵循最大堆的性质。
时间复杂度:O(lgn)
对n个元素的堆来说,lg(n)也是一棵树的高度h,MAX-HEAPIFY的时间复杂度是O(h)

建堆

在这里插入图片描述
时间复杂度为O(n)
也就是说,我们可以在线性时间内,将无序数组构建为最大堆。

堆排序算法

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值