堆一般指二叉堆,結構如下
圈內數字指下標,圈外為內容,如圖現在並不能稱為乙個堆,因為它並不滿足大堆也不滿足小堆的組成,下面介紹大堆和小堆的簡答介紹和實現
大堆是指每個父節點的數都大於自己的每個孩子節點的值
用到的演算法是讓大數上移迴圈至完成大堆
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的待排序的陣列進行堆有序化構...