堆的幾個基本操作以及堆排序

2021-09-29 13:30:27 字數 984 閱讀 8500

#include

using

namespace std;

//堆是一顆完全二叉樹,如果父親結點大於等於孩子結點,那麼就是大頂堆;如果父親結點小於等於孩子結點,那麼就是小頂堆

//這裡以大頂堆為例

const

int maxn=

100;

int heap[maxn]

,n=10

;//向下調整,low指的是欲調整的陣列下標,high為最後乙個元素的陣列下標

void

downadjust

(int low,

int high)

//判斷孩子結點和父親結點的大小,如果孩子結點比父親結點大,那麼交換它們的值,接著將要比較的下標移動到它的左孩子

if(heap[j]

>heap[i]

)else}}

//建堆

//建堆其實就是不斷地向下調整,其中只需要將非葉子結點向下調整即可

//在完全二叉樹中,非葉子結點的個數為n/2,葉子結點的個數為n-n/2

void

createheap()

}//刪除堆中最大元素(堆頂元素),將堆的最後乙個元素覆蓋堆頂元素,然後進行向下調整

void

deletetop()

//插入

//將要插入的元素放在堆中的最後乙個位置上,然後進行向上調整,直到到堆頂或者父親結點的權值較大為止

//low一般指的是1,high指的是欲調整結點的陣列下標

void

upadjust

(int low,

int high)

else}}

void

insert

(int x)

//堆排序

//因為建的是大頂堆,所以這裡的堆排序就是將它進行從小到大進行排序

void

heapsort()

}

堆以及堆排序

二叉 堆 乙個類似完全二叉樹的資料結構 左孩子 2i 右孩子 2i 1 父節點 i 2 以上結論如果記不住,用到時可以自己畫個圖推一下 物理儲存 用陣列儲存a 1,2,3.n 1.調整每個節點的演算法 如果要建立大頂堆,則需遵循每個父親結點的值都要大於左右孩子的值 遞迴版本 param number...

堆的基本操作與堆排序

堆排序堆是一顆完全二叉樹,樹中每個結點的值都不小於 或不大於 其左右孩子的值。向下調整 完全二叉樹葉子結點的個數為n 2 向上取整 在 1,n 2 範圍內為非葉子結點。倒著列舉能夠保證每個結點都是以其為根結點的子樹中權值最大的結點,父結點一旦發現子結點的權值都比自己小就可以終止向下調整,這樣down...

堆的基本實現以及堆排序

heap.h pragma once include include include include include includetypedef int hpdatatype typedef struct heap heap void heapcreat heap hp,hpdatatype a,...