堆和堆排序

本文介绍了堆的概念,包括堆的定义、性质以及两种类型:大顶堆和小顶堆。详细阐述了如何通过数组实现堆,并讲解了堆的新增、删除操作。接着,重点讨论了堆排序的过程,包括建堆和排序两部分,最后提到了堆排序的时间复杂度为O(nlogn)。
摘要由CSDN通过智能技术生成

1.什么是堆?

 

    堆是一种特殊的二叉树,满足以下两点的我们称之为堆

    1.必须是一棵完全二叉树,完全二叉树指树的元素在新增时满足从上到下,从左到右的新增顺序。

 

 

    2.每个节点的值都大于等于或者小于等于左右子树的值。其中每个节点的值大于等于左右子树值的堆我们称之为大顶堆,而每个节点的值小于等于左右子树的值我们称之为小顶堆。

 

 

 

    从上述图中可以看出图1和图2为大顶堆,而图3为小顶堆,而图4不是堆,原因是因为虽然是一棵二叉树,但是不是一颗完全二叉树。

 

2.如何实现堆?

 

    首先堆的前提条件是一个完全二叉树,所以我们可以采用数组进行实现,如下图所示堆,我们可以变成数组为{10,7,6,3,4,5,2},但是我们怎么来知道他们之间的关系呢?比如7和6的父是10,怎么知道呢?我们可以通过一个公式进行计算得到,例如要计算7的父我们可以用7的下标除以2再减1,及i/2-1,同理6的父也是同样的计算方式,而要计算某个结点的子树时,则可以通过i*2+1得到左子树,i*2+2得到右子树。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值