堆排序的基本原理為將待排序序列構造成乙個大根堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個大根堆,重複上述操作,最終序列為有序。
備註:大根堆是每個結點的值都大於或等於其左右孩子結點的值;小根堆是每個結點的值都小於或等於其左右孩子結點的值。
如圖所示:
而實際上堆的儲存形式是一維陣列。
例如:25、15、88、45、8、1、33、21、55、6
如圖所示:
具體步驟:
說明:最開始 i 為最後乙個結點的位置,依據樹的性質,推算該結點的雙親結點,我們將之標記為 s。接下來比較雙親結點和葉子結點,並進行交換,然後找到下乙個雙親結點,重複上述操作,直到最後達到根節點,比較交換完成後,此時大根堆或小根堆便建立完成。(下面我們按照從小到大進行排序,因此我們建立大根堆)
(1)第一次排序:
(2)第二次排序:
以此類推,可得最後一次排序情況為:
此時排為大根堆,接下來只需要將根節點和最後乙個節點交換值,然後對根節點進行一次排序即可.
如圖所示:此時排為大根堆,接下來只需要將根節點和最後乙個節點交換值,然後對根節點進行一次排序即可.
如圖所示:
//此時已經是大根堆
for(i = 0;i < len-1;i++)
}備註:
父====>>子
若父為n,則其右孩子為2n+1;左孩子為2n+2。
子====>>父
若子為n,則其父為(n-1)/2;
c語言 實現堆排序演算法
今天在 演算法導論 第二版看完了 堆排序 演算法,就順便用c語言實現了一下。堆排序演算法的核心思想,使用一種二叉堆的資料結構來儲存資料,其中二叉堆 最小二叉堆 的主要性質為 1 父節點小於所有的子節點的數值 注 最小堆 2 二叉堆為滿二叉樹 其中堆排序演算法,主要包括一下幾個主要的部分 1 保持堆特...
排序演算法的C語言實現 堆排序
堆 優先佇列 可以用於花費nlogn 時間的排序,基於該想法的演算法叫做堆排序。因為堆的根總是最大的或者最小的,所以我們可以先將輸入陣列轉換為最大或者最小堆,然後刪除最大 最小值 也就是刪除根。這在二叉堆的介紹中已經實現了。一種方法是將刪除的元素放入另乙個陣列,但是這樣會浪費一倍的記憶體空間。由於每...
經典排序演算法 氣泡排序(C語言實現)
氣泡排序是一種較為簡單的排序演算法,其基本思想為從頭開始依次比較相鄰的兩個元素大小,將較大 較小 的元素移至右端,最終使最大 最小 的元素移至序列最後,再次重複上述過程,直到最終序列完全有序為止。例如 有一行數分別是26 10,83,56,28,66,7 說明 按照從小到大的順序進行排序,方框數為比...