堆排序(最后一个非叶子节点的序号是n/2-1的推理)
可以分两种情形考虑:
1.堆的最后一个非叶子节点若只有左子节点
2.堆的最后一个非叶子节点有左右两个子节点
堆的定义:
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
完全二叉树的性质之一是:如果节点序号为i,在它的左子节点序号为2i+1,右子节点序号为2i+2。
对于第一种情形:左子节点的序号为n-1,则n-1=2*i+1,推出i=n/2-1;
对于第二种情形:左子节点的序号为n-2,在n-2=2i+1,推出i=(n-1)/2-1;右子节点的序号为n-1,则n-1=2i+2,推出i=(n-1)/2-1;
很显然,当完全二叉树最后一个节点是其父节点的左子节点时,树的节点数为偶数;当完全二叉树最后一个节点是其父节点的右子节点时,树的节点数为奇数。
根据语法的特征,/ 符号取整,则若n为奇数时(n-1)/2-1=n/2-1。