首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
堆排序的原理是什么?
[问答题]
介绍一下,堆排序的原理是什么?
添加笔记
求解答(0)
邀请回答
收藏(18)
分享
纠错
4个回答
添加回答
2
网易全岗位内推官
堆是一个完全二叉树,如果按照层序遍历结果存储为数组,下标为i且根节点i=0,则满足Key[i]>=Key[2i+1]&&Key[i]>=key[2i+2]的称为大根堆,即根结点大于子结点,堆顶为最大值。 堆排序第一步建堆,即将输入序列看作是层序遍历结果,然后按顺序写成完全二叉树的形式。第二步调整堆,即从最后一个非叶结点开始调整,它的数组下标为最后一个数的下标-1之后除以2,保证这个结点比子结点大。然后下标减一继续调整,交换结点之后的孩子结点有可能不满足堆的性质,继续调整直到下标为0,这里有递归和非递归两种方法。 堆排序就是根据前边建好的堆先取出根结点和最后一个结点交换,然后对前边len-1个结点进行堆调整,再取出根结点和倒数第二个结点交换,对前边len-2个结点堆调整,以此类推直到所有结点都取出。 heapAdjust函数可看做每次都从当前结点走到叶子节点,数高度为log(n+1)向上取整,所以复杂度可视为O(logn),简单起见,不必考虑到底是从根节点到达叶结点还是从中间某节点到达叶结点。建堆时调用heapAdjust函数n/2次,排序时调用heapAdjust函数n-1次,得到三种情况下的复杂度都是O(logn)* (n/2)+O(logn)*(n-1),化简为O(nlogn)。空间复杂度O(1)。是不稳定的排序
发表于 2019-04-08 18:47:23
回复(1)
1
nulifengdou
先建堆,交换首尾元素,再整堆,重复以上步骤。
发表于 2019-01-01 23:48:39
回复(0)
0
林林林林林5
1.先使用makeheap()创建最大堆或最小堆,2.交换arr[0]和arr[last-1],3.依据最大堆或最小堆来调整堆的顺序,4.重复步骤2,3直到排序完成。
发表于 2019-04-08 15:12:24
回复(0)
0
beinghsiung
不知道
发表于 2019-04-01 18:11:13
回复(1)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
C++工程师
测试工程师
排序
Java工程师
上传者:
小小
难度:
4条回答
18收藏
2312浏览
热门推荐
相关试题
假定一个待哈希存储的线性表为(32...
哈希
评论
(1)
5.下列判断正确的是( )
资料分析
言语理解与表达
资料分析
评论
(1)
已知a
40
=...
京东
职能
2019
财务
保险
评论
(1)
《拳皇97》最后BOSS是谁?
游戏常识
评论
(1)
《魔兽世界》中,下列不属于玩家可以...
游戏常识
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题