堆操作及應用

2022-09-04 03:00:09 字數 2472 閱讀 9173

1. 堆是乙個完全二叉樹,堆主要設計到的操作有插入,刪除,堆化。

2. 堆的主要應用有堆排序:從小到大排序,使用大頂堆;從大到小排序,使用小頂堆。

3. 下面以大頂堆為例,給出實現**:

view code

1 #include 2 #include 3

4using

namespace

std;56

//大頂堆的實現

7class

myheap816

else

1720 data=new

int[heapsize];

21 currentsize=0;22

}23int leftchild(int

pos)

2427

int rightchild(int

pos)

2831

int parent(int

i)32

3536

//遞迴的處理方式

37//

void max_heapify(int pos)

38//

47//

if (r48

//51

//if (maxnumber!=pos)

52//

56//}57

58//

使用迴圈替代尾遞迴

59void max_heapify(int

pos)

6071

if (r

7275

if (maxnumber!=pos)

7679

else

8083 pos=maxnumber;84}

85}86bool

isfull()

8790

91//

插入,將元素插入到末尾,然後將元素上浮到合適的位置

92void insert(int

elem)

9399 data[currentsize++]=elem;

100int pa=parent(currentsize-1

);101

int cur=currentsize-1

;102

while ((pa>=0) && (data[pa]

103108

}109

110//

刪除堆頂的元素

111//

將堆頂元素和最後乙個元素交換,然後將堆頂元素下降

112//

到乙個合適的位置

113void

deletemax()

114119

120//

列印121

void

print()

122127 cout<

128}

129130

//堆排序

131void

heapsort()

132140

}141 ~myheap()

142145

protected

:146

private

:147

enum ;

148int

heapsize;

149int

currentsize;

150int *data;

151};

152153

intmain()

154;

156int number[length]=;

157myheap myheap(length);

158for(int i=0;i)

159162

myheap.print();

163//

int ppos=myheap.parent(length-1);

164//

for (int i=ppos;i>=0;i--)

165//

168myheap.heapsort();

169myheap.print();

170//

myheap.deletemax();

171//

myheap.print();

172 }

4. 堆的應用:

(1) 乙個檔案中包含了1億個隨機整數,如何快速的找到最大(小)的100萬個數字?(時間複雜度:o(n lg k))。

答:若要找出100萬個最大的數,需要維護乙個含有100萬元素的小頂堆。遍歷1億個數,如果某個數比小頂堆最小元素大,則用這個數替代小頂堆中的最小數,之後使小頂堆最小堆化。遍歷結束之後,堆中儲存的就是最大的100萬個數。遍歷一次的時間複雜度o(n),最小堆化o(lgk)。總的時間複雜度o(n lg k)。

5.堆是一種非常基礎但很實用的資料結構,很多複雜演算法或者資料結構的基礎就是堆,因而,了解和掌握堆這種資料結構顯得尤為重要。

資料結構 堆及堆的應用

堆是一種特殊的樹形結構,堆的把每乙個節點都有乙個值,我們通常所說的堆這種資料結構,指的就是二叉堆。其實它可以被看做乙個完全二叉樹。它的每個節點的子樹又可以被看做是堆。堆可以分為最大堆和最小堆 最大堆 每個父節點都大於孩子節點 最小堆 每個父節點都小於孩子節點 a 我們在定義堆的資料成員的時候,利用s...

資料結構 堆及堆的應用

1.堆 把一組資料按照完全二叉樹的順序儲存模式儲存在乙個二維陣列中,若ai 若ai ai 1 ai ai 2,則稱為大堆 i 0,1,2.n 在堆中,若設父親節點為parent,則它的左孩子為2 parent 1,右孩子為2 parent 2 void makeheap datatype a,siz...

堆的基本演算法及應用。

今天我來介紹一下堆的基本演算法和它的一些簡單應用。一 基本演算法 pragma once include include include include includetypedef struct heapheap 堆的初始化。void heapinit heap ph,int array,int ...