堆是一種特殊的資料結構,它是完全二叉樹,可以用一維陣列來儲存,因為二叉樹的性質,所以根據陣列下標就可以確定位置,下面**是關於堆的實現, 刪除的過程其實就是將堆的根節點取出的過程, 這時的順序就是有序的, 如果是最小堆,那麼就是從小到大排序,反之,就是從大到小
1 #include 2上面是一次性的輸入資料,當然也可以新增資料,新增資料的時候,只要把資料新增到最後,然後調整順序使它滿足最小堆就行了3int h[101];4
intn;5//
交換函式
6void swap(int a, intb)7
12//
向下調整函式, 調整每個點都滿足最小堆的特性
13void siftdown(int
i)14
23else
24 t =i;
25if(i * 2 + 1
<= n)//
再比較右兒子
2631}32
if(t != i)//
如果最小的節點不是自己,說明子節點中有比父節點小的
3337
else
38 flag = 1;39
}40}41
//刪除堆的根節點的函式,
42int
deleted()
4350
//建立堆
51void
create()
5256
57int
main()
5865
create();
66//
從小到大輸出
67for(int i = 1; i <= num; i++)
68 printf("
%d "
, deleted());
69return0;
70 }
**很簡單
1下面是堆排序的實現,先構造最小堆,然後再堆排序,基本**類似,就增加了乙個堆排序函式,這個函式是將第乙個元素,也就是根節點與最後乙個交換,那麼最後的這個一定是最小的,然後n(總數)--, 這是在調整第乙個的位置,使它滿足最小堆,一次調整到只剩乙個元素就可以了,堆排序的時間複雜度和快排和歸併一樣都是nlog(n), 也是比較快的排序,下面是堆排序的**//向上調整函式
2void siftup(inti)3
13 }
1 #include 2附(堆的另一種版本):3int h[101];4
intn;5//
交換函式
6void swap(int a, intb)7
12//
向下調整函式, 調整每個點都滿足最小堆的特性
13void siftdown(int
i)14
23else
24 t =i;
25if(i * 2 + 1
<= n)//
再比較右兒子
2631}32
if(t != i)//
如果最小的節點不是自己,說明子節點中有比父節點小的
3337
else
38 flag = 1;39
}40}41
42//
建立堆43
void
create()
4448
//堆排序
49void
heapsort()
5058}59
60int
main()
6168 num =n;
69create();
70heapsort();
71for(int i = 1; i <= num; i++)
72 printf("
%d "
, h[i]);
73 printf("\n"
);74
return0;
75 }
#include #includeview code#include
#include
using
namespace
std;
struct
heapstruct;
bool isempty(heapstruct *h)//
判斷佇列是否為空
void insert(heapstruct *h, int item)//
插入函式,將item這個數插入到數列中
h->element[i] =item;
}int delete(heapstruct *h)//
刪除堆頂元素
intchild, parent;
int tmp = h->element[1
];
int t = h->element[h->size--];
for (parent = 1; parent * 2
<= h->size; parent =child)
h->element[parent] =t;
return
tmp;
}heapstruct* build(heapstruct *h)//
當所有的資料都輸入到陣列的時候,這時候陣列還不是堆,要將他調整成堆
h->element[parent] =tmp;
}returnh;}
heapstruct* create(int maxsize)//
初始化建立乙個大小為maxsize的堆
int top(heapstruct *h)//
獲得堆頂元素
return h->element[1];}
intmain()
堆及堆排序
什麼是堆?堆是一棵完全二叉樹,並滿足 n od ei n ode2 i 1 andn odei n ode2 i 2 node quad and quad node i node nodei n ode2 i 1 and node i n ode2 i 2 大頂堆 或者nod ei n ode2 i...
堆的實現及堆排序
前兩天刷筆試題,判斷乙個陣列的序列可以構成堆。仔細想了想,腦海裡幾乎已經遺忘了堆的知識,今天又重新去看書,把堆的知識總結一下。首先堆是一種陣列物件,它可以被看成乙個完全二叉樹。在我們常見的堆中有大堆和小堆。對大堆來說,每個父節點都大於孩子結點 小堆恰好相反。而且,大堆 小堆的每個子樹也是乙個大堆 小...
堆(資料結構)及堆排序
這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...