資料結構排序演算法之堆排序(c語言實現)

2021-07-29 19:07:08 字數 1428 閱讀 4172

堆排序也是眾多排序演算法中比較重要的一種,它屬於選擇排序的一種。堆可以認為是樹的一種,它利用陣列的儲存方式來儲存乙個完全二叉樹。堆排序就是利用這樣的結構進行排序的。以樹的結構來說,每乙個非終端節點(即不是葉子的結點)都滿足:比它的左兒子和右兒子都小,或者比它的左兒子和右兒子的值都大即可。因此,如果為乙個堆結構,則堆頂元素(完全二叉樹的根)一定是這個序列中所有元素的最大值或最小值。

如果依次將堆頂的最小值(最大值)輸出,再將剩餘的序列中的元素重新組成乙個新的堆,再次得到乙個堆頂元素即剩餘序列的最小值(最大值),如此反覆進行,則做到了按照由小到大(由大到小)的順序輸出原序列,也就得到了乙個有序的序列。在堆排序的演算法中,更是不需要直接輸出,或者借助輔助陣列,直接在原陣列中進行值的交換即可使原序列變得有序:如果想要按下標由小到大排列,序列值遞增,就構造大頂堆;如果想要按照下標有小到大排列,序列值遞減,就構造小頂堆。迴圈將堆頂元素值存入未排序序列的最後乙個位置即可。例如,序列長為9,則第一次將堆頂存入array[9],之後重新構造大頂或小頂堆,此時的堆頂元素即可認為是第二大或第二小的元素,存入array[8]中......不斷重複進行,直到最後僅剩乙個元素,結束迴圈,即可認為此時已經按照意願排序完畢。

***這個演算法利用了二叉樹的乙個性質:一棵完全二叉樹,若i=1,則結點i為二叉樹的根,無雙親;若i>1,則其雙親就是結點i/2的取整部分。也就是說,乙個完全二叉樹,非葉子結點個數為總結點個數乘以1/2取整,因而我們在構造堆的時候只需取一半的結點序號進行迴圈。這也就是下面**裡面的for迴圈從i=s->length/2開始的原因。

下面是我根據嚴蔚敏老師《資料結構(c語言版)》書上的堆排序演算法實現的c語言**,僅供參考。

執行環境:win10&&visual  studio2015

為了方便各位,將程式寫在了乙個原始碼檔案中。

執行成功。

資料結構排序演算法之堆排序

關於堆排序的相關知識非常複雜,不懂得可以參考任意一本資料結構教程,本部落格只對堆排序框架及 進行講解。堆排序分三個大的步驟 建初堆,堆調整,堆排序 其中最核心的是堆調整 1建初堆 從陣列中的最後乙個非葉子節點開始,從下而上倒推 重複呼叫堆調整函式 2堆調整 堆調整的前提是已建好了乙個堆,但是因為輸出...

c語言資料結構之 堆排序

演算法 先生成隨機數,賦值到陣列,將陣列第乙個元素a 0 設定為哨兵,函式呼叫陣列和隨機數個數n,再設定n 2的根結點與孩子結點進行比較操作,若右孩子存在,則選出三個數里最小的數賦值給根節點,如果右孩子不存在,則只需比較左孩子與根節點大小,一直迴圈操作至a 1 再從a 2 開始進行根結點與孩子結點進...

資料結構 C語言實現排序演算法 堆排序

堆排序 利用堆這種資料結構所設計的一種排序演算法。大堆 根節點值大於子節點的值,對應為公升序序列。小堆 根節點值小於子節點的值,對應為降序序列。堆排序實現的兩個步驟 建立堆堆排序 下述例子是進行大堆建立 建立大堆 圖例 建立步驟 尋找最後乙個分支的根節點 記為pos pos挨個減小,對每個分支,都進...