設有n個元素的序列k1,k2,…,kn,當且僅當滿足下述關係之一時,被稱為堆。
1.ki<=k2i且ki<=k2i+1,滿足這種條件的堆稱為小頂堆。
2.ki>=k2i且ki>=k2i+1,滿足這種條件的堆稱為大頂堆。
拋開定義,堆可以看作是一棵樹的陣列物件,樹中每個節點都不大於(小頂堆)或不小於(大頂堆)父節點。
下面以兩幅圖來更好地理解「堆"(上圖為大頂堆,下圖為小頂堆)
(這裡利用小頂堆進行堆的建立和調整)
首先建立堆,即把待排序的序列轉換成堆的形式,這個過程就是乙個反覆篩選的過程。
之後將根節點與最後乙個節點交換。
交換之後會打亂堆的規律,需要對前(n-1)個節點進行調整,使之重新成為堆。
之後交換根節點與倒數第二個節點。
重複調整,直到序列有序為止。
#include
#include
#include
#define max 100
int array[max]
;int
adjust
(k,m)
//調整堆
else
} array[i]
=t;}
intsiftsort
(int n)
//堆排序
for(i=n;i>=2;
--i)
}void
main()
siftsort
(count)
;printf
("排序結果為:\n");
c語言 實現堆排序演算法
今天在 演算法導論 第二版看完了 堆排序 演算法,就順便用c語言實現了一下。堆排序演算法的核心思想,使用一種二叉堆的資料結構來儲存資料,其中二叉堆 最小二叉堆 的主要性質為 1 父節點小於所有的子節點的數值 注 最小堆 2 二叉堆為滿二叉樹 其中堆排序演算法,主要包括一下幾個主要的部分 1 保持堆特...
排序演算法的C語言實現 堆排序
堆 優先佇列 可以用於花費nlogn 時間的排序,基於該想法的演算法叫做堆排序。因為堆的根總是最大的或者最小的,所以我們可以先將輸入陣列轉換為最大或者最小堆,然後刪除最大 最小值 也就是刪除根。這在二叉堆的介紹中已經實現了。一種方法是將刪除的元素放入另乙個陣列,但是這樣會浪費一倍的記憶體空間。由於每...
經典排序演算法 堆排序(C語言實現)
堆排序的基本原理為將待排序序列構造成乙個大根堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n 1個元素重新構造成乙個大根堆,重複上述操作,最終序列為有序。備註 大根堆是每個結點的值都大於或等於其左右孩子結點的值 小根堆是每個結點的值都小於或等於其左...