首先是構造最大堆(最小堆,排序結果剛好相反具體有一些改動)
書中證明了從第n/2開始即可構造出最大堆
void max_heap(int a,int i)
else
if(r<=heap_size && a[r]>a[largest])
if(largest != i) }
void build_max_heap(int a)
然後就是排序演算法,構建好最大堆以後並不是 有序的但是根一定是最大的,每次把跟節點取出來放到已排序的地方,然後有對後邊又進行堆化
最後所有元素按順序放在了陣列裡面
void heap_sort(int a)
}
主
函式
#include #define max 10
int heap_size;
int main(void)
;print_array(a);
heap_size=max-1;
heap_sort(a);
print_array(a);
getchar();
return 1;
}
第六章 堆排序 C
二叉堆 是乙個陣列,可以看成乙個近似的完全二叉樹。除了最低層,該樹是完全滿的。有兩種形式 最大堆和最小堆。堆的兩個用途 排序和優先佇列。排序 若要按公升序排列,則使用最大堆。有限佇列 在計算機作業排程中一般使用最大堆,在基於事件驅動的模擬器中使用最小堆。堆的常用操作為 max heapify a,i...
演算法導論 第六章《堆排序》
本章開始介紹了堆的基本概念,然後引入最大堆和最小堆的概念。全章採用最大堆來介紹堆的操作,兩個重要的操作是調整最大堆和建立最大堆,接著著兩個操作引進了堆排序,最後介紹了採用堆實現優先順序佇列。二叉 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。除了最底層外,該樹是完全充滿的,而且是從左到右填充...
演算法導論 第六章 堆排序
二叉 堆資料結構是一種陣列物件,如下圖所知,他可以被視為一顆完全二叉樹。其有如下性質 1 對於i節點 i表示下標 其父節點為li 2 左孩子節點為2i,右孩子節點為2i 1 2 最大堆滿足 a parent i a i 最小堆滿足 a parent i a i 3 堆的高度為 lgn 4 子陣列元素...