資料結構 大小堆的實現及堆排序

2021-07-23 15:05:08 字數 1627 閱讀 3484

堆一般指二叉堆,結構如下

圈內數字指下標,圈外為內容,如圖現在並不能稱為乙個堆,因為它並不滿足大堆也不滿足小堆的組成,下面介紹大堆和小堆的簡答介紹和實現

大堆是指每個父節點的數都大於自己的每個孩子節點的值

用到的演算法是讓大數上移迴圈至完成大堆

void adjustup(size_t child)

else}}

過程如下圖

第一次交換33和43;

第二次交換43和12;

第三次交換33和12;

第四次交換23和8;

小堆的演算法如下,採用大數向下迴圈轉換

void adjustdown(size_t parent)

if(com(_a[child],_a[parent]))

else}}

迴圈如下

第一次交換33和5,

第二次交換12和5,

第三次交換4和8,

第四次交換5和4

堆排序演算法如下

void heapsort(t* a,size_t size)

print(_a,size);

}

全部**

#include #include #include#include using namespace std;

templatestruct big

};templatestruct less

void heapsort(t* a,size_t size)

print(_a,size);

} void adjustup(size_t child)

else

}} void adjustdown(size_t parent)

if(com(_a[child],_a[parent]))

else

}} bool empty()

t& top()

void push(const t& x)

void pop()

void print(vectora,size_t size)

;

測試用例

void test()

; heaph1;

h1.heapsort(tree,sizeof(tree)/sizeof(tree[0]));

}void test2()

; heaph1;

h1.heapsort(arr, sizeof(arr)/sizeof(arr[0]));

heaph2;

h2.heapsort(arr, sizeof(arr)/sizeof(arr[0]));

}

資料結構 大小堆

如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹 的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱這個堆為最小堆 或最大堆 最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵...

堆(資料結構)及堆排序

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

資料結構 堆排序(c 實現)

一 堆排序的定義 堆排序是一種樹形選擇排序,在排序過程中可以把元素看成是一顆完全二叉樹,每個節點都大 小 於它的兩個子節點,當每個節點都大於等於它的兩個子節點時,就稱為大頂堆,也叫堆有序 當每個節點都小於等於它的兩個子節點時,就稱為小頂堆。二 堆排序演算法 1.將長度為n的待排序的陣列進行堆有序化構...