堆及堆排序

2022-05-24 10:03:09 字數 2950 閱讀 3367

堆是一種特殊的資料結構,它是完全二叉樹,可以用一維陣列來儲存,因為二叉樹的性質,所以根據陣列下標就可以確定位置,下面**是關於堆的實現, 刪除的過程其實就是將堆的根節點取出的過程, 這時的順序就是有序的, 如果是最小堆,那麼就是從小到大排序,反之,就是從大到小

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

//向上調整函式

2void siftup(inti)3

13 }

下面是堆排序的實現,先構造最小堆,然後再堆排序,基本**類似,就增加了乙個堆排序函式,這個函式是將第乙個元素,也就是根節點與最後乙個交換,那麼最後的這個一定是最小的,然後n(總數)--, 這是在調整第乙個的位置,使它滿足最小堆,一次調整到只剩乙個元素就可以了,堆排序的時間複雜度和快排和歸併一樣都是nlog(n), 也是比較快的排序,下面是堆排序的**

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 #include 

#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()

view code

堆及堆排序

什麼是堆?堆是一棵完全二叉樹,並滿足 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...

堆的實現及堆排序

前兩天刷筆試題,判斷乙個陣列的序列可以構成堆。仔細想了想,腦海裡幾乎已經遺忘了堆的知識,今天又重新去看書,把堆的知識總結一下。首先堆是一種陣列物件,它可以被看成乙個完全二叉樹。在我們常見的堆中有大堆和小堆。對大堆來說,每個父節點都大於孩子結點 小堆恰好相反。而且,大堆 小堆的每個子樹也是乙個大堆 小...

堆(資料結構)及堆排序

這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...