阿摩線上測驗 登入

申論題資訊

試卷:107年 - 107 地特四等 程式設計概要#73697
科目:程式設計
年份:107年
排序:0

題組內容

三、請用下列程式回答下列問題。(每小題 5 分,共 25 分)5c1b2c8b1cb22.jpg

申論題內容

⑸請說明 reorder()遞迴函數的功用為何。 

詳解 (共 3 筆)

詳解 提供者:hchungw
根據上傳的代碼圖片,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 陣列中當前所有值中的最大值。
詳解 提供者:set34556

詳解 提供者:澐
排序