C 資料結構 堆

2021-08-06 03:30:28 字數 2985 閱讀 8549

堆--一種可被視為完全二叉樹的結構,實現有多種方法

(一)  c++ stl - 優先佇列實現

1.首先寫好佇列標頭檔案

#include

2.定義乙個int型、值小的數優先順序高(先出佇列)的佇列-----小根堆

*最後的'' 與『>』間注意留空格

priority_queue, greater> a;
大根堆的定義:

priority_queue> a;
//priority_queue, less> a;

3.操作:

往堆中加乙個元素:

a.push(x);
彈出堆頂元素:

a.pop();
訪問堆頂元素:

a.top();
堆的大小:a.size()

判斷堆是否為空:a.empty();

4.乙個經典的栗子:合併果子

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。

每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。

因為還要花大力氣把這些果子搬回家,所以多多在合併果子時要盡可能地節省體力。假定每個果子重量都為1,並且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。

例如有3種果子,數目依次為1,2,9。可以先將1、2堆合併,新堆數目為3,耗費體力為3。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為12,耗費體力為12。所以多多總共耗費體力=3+12=15。可以證明15為最小的體力耗費值。

輸入格式:

輸入包括兩行,第一行是乙個整數n(1<=n<=10000),表示果子的種類數。第二行包含n個整數,用空格分隔,第i個整數ai(1<=ai<=20000)是第i種果子的數目。

輸出格式:

輸出包括一行,這一行只包含乙個整數,也就是最小的體力耗費值。輸入資料保證這個值小於2^31。

輸入樣例:

3 

1 2 9

輸出樣例:

15

我的**:

#include #include using namespace std;

priority_queue, greater> a;

int n, t, ans, x, y;

int main()

for(int i=1; i<=n-1; i++)

cout << ans << endl;

return 0;

}

(二)自定義結構體-陣列實現

在寫堆之前,首先要了解堆的性質:

設(從1儲存的)陣列heap,元素個數為heap_size; 

- heap[1]表示堆頂;

- 如果乙個有中間結點是i,那麼它的左孩子的下標就是2*i,右孩子的下標就是2*i+1,父親是2*i

- 如果乙個結點i,1 <= i <= heap_size/2  那麼它有孩子;  heap_size/2 < i <= heap_size 則結點i為葉子結點

小根堆:heap[i/2] <= heap[i];

大根堆:heap[i/2] >=heap[i];

下面以小根堆討論:

put()函式:在最後乙個位置加入元素,迴圈與父結點比較,若小於父結點則互換,直到大於等於父結點或到了根結點

get()函式:取走堆頂端元素,將最後乙個元素覆蓋根,迴圈與孩子比較,與左右(二或乙個)孩子中較小的互換,直到小於等於孩子或到了葉子結點

合併果子用這種方法

**(覺得不夠簡潔):

#include #include //int_max

using namespace std;

struct heap

void put(int x) else break;

} }int get(void) else if(a[index] > tmpy) else break;

} else else if(a[index] > tmpx) else break;

}} return rtn;

}};heap a;

int n, t;

int ans;

int main()

for(int i=1; i<=n-1; i++)

cout << ans << endl;

return 0;

}

2023年2月重構**-小根堆:

#include #include using namespace std;

struct heap

int top()

void down(int x) else

} }void up(int k)

} int insert(int v)

int pop()

}; int main()

for(int i=1; i<=n; i++)

return 0;

}

重構×3

struct priorityqueue 

void push(int x)

a[i] = x;

} int top()

int pop()

a[i] = x;

return res;

}} heap;

(%二叉堆-binary_heap%!)

資料結構 堆 C

二叉堆堆排序 堆 heap 分為二叉堆 二項式堆 斐波那契堆,堆是非線性資料結構,相當於一維陣列,有兩個直接後繼。堆又被稱為優先佇列,儘管名為優先佇列,但堆並不是佇列。因為佇列遵循first in,first out,但是堆是按照元素的優先順序取出元素。所以 堆 是實現排程器的理想資料結構。堆排序與...

C 資料結構 18 堆

堆的實現通過構造二叉堆 binary heap 實為二叉樹的一種 由於其應用的普遍性,當不加限定時,均指該資料結構的這種實現。這種資料結構具有以下性質。任意節點小於 或大於 它的所有後裔,最小元 或最大元 在堆的根上 堆序性 堆總是一棵完全樹。即除了最底層,其他層的節點都被元素填滿,且最底層盡可能地...

資料結構 堆

最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...