堆排序(最後一個非葉子節點的序號是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。