根據上傳的代碼圖片,reorder() 函數的目的是調整 num 陣列中的元素,使其滿足最大堆的性質。在一個最大堆中,對於每個元素 num[k],其值必須大於或等於其子元素的值,這些子元素在陣列中的位置是 2*k 和 2*k+1(這裡的索引是從 1 開始的)。如果 num 陣列的索引是從 0 開始的,那麼子元素的位置是 2*k+1 和 2*k+2。
reorder() 函數通過以下步驟實現這一點:
遞迴呼叫 reorder(k) 傳入一個索引 k。
如果 k 不為 0(不是陣列的第一個元素,因為最大堆的根是 num[0]),並且 num[k] 的值大於其父元素 num[k/2] 的值,則需要調整。
將 num[k] 和其父元素 num[k/2] 的值交換。
繼續遞迴呼叫 reorder(k/2),將索引 k 替換為其父元素的索引 k/2,沿著堆向上移動,直到不需要更多交換或達到根。
通過這種方式,每當 main 函數中通過 scanf 讀取一個新的數值後,就調用 reorder() 函數。該函數確保了新加入的數值被放置在滿足最大堆性質的正確位置上。如果新加入的數值大於其父節點的數值,reorder() 會將其上移,這樣做可能會連續交換多次,直到新值找到正確的位置。
通過這種方式,不管輸入的數值順序如何,最終 num 陣列都將調整為最大堆的形狀,其最大的值位於 num[0]。所以,reorder() 函數維護了在任何時候 num[0] 都是 num 陣列中當前所有值中的最大值。