在牛客网上看到一道题
答案是c,但是之前只接触插入法建堆,没了解筛选法建初始堆,于是网上冲浪,查找了一波解析,于是有了现在这个思路总结(看半天也没有看到比较靠谱的代码),然后总结了一下,按照这种思路,能得到C答案,但仍然存在一点疑惑(初始堆难道不应该是大顶堆或者小顶堆嘛,这结果也不是呀,还是说,有什么定义我不知道?求解),需要再去看看书。。。
最终还是觉得答案是错的,按照概念重新更正了图解和伪代码。感觉答案应该是:-1,4,7,8,20,15,7,9
堆排序建初始堆有两种思路:
筛选法:将当前待排序的n个记录为作为一个大小为n的一维数组,然后向下取整parent=n/2开始比较(即为最后一个非叶节点),用图和一段伪代码做了介绍(待指正)
![筛选法构造初始堆](https://img-blog.csdnimg.cn/20190828160144473.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NzeHkwNjA2,size_16,color_FFFFFF,t_70)
伪代码
for(int i=n/2;i>0;i--){
par = i;//父节点
while(par*2<=n){
lch = par*2;//左子节点
rch = lch+1;//右子节点
min = lch;
if(rch<=n){//有两个子节点
if(arr[lch]>arr[rch]){
min = rch;
}
}
if(arr[min]<arr[par]){
swap(arr,min,par);
par = min; //往下遍历
}
}
}
插入法:将n个记录依次插入二叉树中,若其比父节点值小,则浮操作,直到其比父节点大