二叉堆(也叫堆)是乙個部分排序的二叉樹,其排序規則體現在它的堆序性質上:最大堆和最小堆,最大堆就是其對於任一節點,每個節點的鍵值都大於等於它的孩子節點,所以根節點鍵值最大。最小堆則相反。
堆是一棵完全二叉樹,具備完全二叉樹的性質,可以用乙個陣列表示而不需要指標,在起始位置為 0 的陣列中任一位置 i 上的元素,其左兒子在位置 2*i+1 上,右兒子在左兒子的後面鄰近位置上,它的父節點則在位置 (i-1)/2。因此,乙個堆資料結構將由乙個陣列(不管鍵值是什麼型別)、乙個代表最大容量的整數以及當前的堆大小組成。
#include
#include
//對當前節點進行調整,這樣得到乙個大頂堆
void
heapadjust
(int
*k,int n)
//引數n為陣列的最大下標,不是陣列長度
if(k[i]
< k[
2* i+2]
&&(2* i +2)
<= n)}}
//將堆排序後陣列的根節點和最後乙個節點的值互換
void
swap
(int
*k,int i,
int j)
//堆排序
void
heapsort
(int
*k,int n)
//引數n為陣列的長度
}int
main()
;heapsort
(arr,10)
;printf
("排序後的結果是:\n");
for(
int i =
0; i <
10; i++
)return0;
}
堆排序的實現就是三個函式。
由於堆排序比較簡單,這裡就只提供**。相信你自己肯定看的懂!!!
排序詳解 堆排序
堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a parent i a i 在陣列的非降序排序中,需要使用的就是大根...
堆排序詳解
一 堆的定義 堆的定義如下 n個關鍵字序列l n 成為堆,當且僅當該序列滿足 l i l 2i 且l i l 2i 1 或者 l i l 2i 且l i l 2i 1 其中i屬於 1,n 2 滿足第 種情況的堆稱為小根堆 小頂堆 滿足第 種情況的堆稱為大根堆 大頂堆 在大根堆中,最大元素存放在根結點...
堆排序詳解
public class heapsort 此時已經完成了最大堆的構建,下面進行排序。for int i len 1 i 0 i 維護最大堆,保證父節點大於等於子節點 public static void maxheapify int a,int index,int len if rightchil...