堆排序演算法

2021-05-23 03:12:42 字數 863 閱讀 5888

堆排序(heap sort)是一種選擇排序,每趟從待排序列中選出最大或者最小的關鍵字。

首先來解釋下什麼叫堆?

堆定義:n個元素的序列當且僅當滿足下關係時,稱之為堆。

堆排序,也是對滿足堆條件的序列的排序。那麼對乙個無序的序列進行堆排序之前,首先要將待排序序列轉換成堆。如何將無序序列轉換成堆?

若將滿足堆條件的序列看做是完全二叉樹儲存結構,那麼這顆完全二叉樹就滿足以下條件:某根結點的值大於等於其左右子節點的值,或者根結點的值小於等於左右子節點值。根據這個特點,將無序序列轉換成堆的思路就有了。即是:將不滿足此條件的完全二叉樹轉換成滿足此條件的完全二叉樹。下面以根堆最大為例描述具體的實現方法。

首先從第

-1個元素;若不是則將這個元素與其左右結點中較大的元素進行互換。

無序序列轉換成了堆,那麼如何對堆進行排序呢?

堆排序是一種選擇排序,也就是說每趟從數列中選擇乙個最大或者最小的元素。那麼在堆中,根結點就是序列中最大或者最小的元素。那麼對堆進行排序首先就是將序列的第乙個元素也即是根結點元素與最後乙個元素進行交換,序列長度減一。那麼現在最後乙個元素就稱為了根結點元素,這必然打亂了原來的堆,那麼就需要原有的堆進行重新排列,形成乙個新的堆。檢視新的根結點r是否大於等於其左右子節點,若不滿足則與其中較大者m互換,互換了之後r是m的子結點,但是若此時的r還有子節點的話,還需要檢視其是否大於等於其子節點

注意:上述描述中講到完全二叉樹,並不是說明待排序的序列需要用二叉樹的結構來儲存。而是,將待排序的序列看成是一顆完全二叉樹的順序儲存結構

具體實現**:

排序演算法 堆排序

1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...

排序演算法 堆排序

花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...

排序演算法 堆排序

由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...