中易网

C语言堆排序 几个不明白的地方。高手帮忙啊!~

答案:1  悬赏:20  
解决时间 2021-01-15 22:12
  • 提问者网友:世勋超人
  • 2021-01-15 14:41
C语言堆排序 几个不明白的地方。高手帮忙啊!~
最佳答案
  • 二级知识专家网友:第四晚心情
  • 2021-01-15 15:32
这里为什么是i=n/2-1,初学者可能会不明白。
你这样考虑。
首先对于叶子节点,我们没有必要进行维护操作,也就是没有必要调用你的HeapAdjust
函数
为什么呢?因为叶子节点没有孩子。就算调用了,也不起作用。
所以你应该从n/2-1下标所对应的节点开始,一直维护到0下标对于的节点。
n/2-1是编号最大的非叶子节点,而0号节点是根节点
至于这里为什么是--i,因为这里是自低向上的维护,最后一个维护的必然是根节点。

实际上这两句话的作用是建堆。
for(i=n/2-1;i>=0;--i)
     HeapAdjust(data,i,n-1);

我画了个草图

追问


如果这样 这个非叶子结点应该是2个啊  而如果按那个计算却是1个了啊!!!高手帮帮忙!
追答这里并不是4/2-1,这里是5/2-1=1。(这是你犯的第一个错误)

然后就是这里的1代表的1号下标开始,那么你会依次遍历1,0两个节点。所以肯定是两个而不是1个吖。(这是你的第二个错误,记住,0号单元也有节点的吖)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息