主要功能
最小堆排序(大到小):
void order();
刪除首元素:
type fetch_root();
插入元素:
void insert_item(const type & item);
void insert_item_faster(const type & item);
//快速版本
關鍵
source code
/**
* @file mini-complete-binary-heap.cpp
* @brief
* @author [email protected]
* @version
* @date 2017-07-04
*/#include
#include
#include
#include
#include
using
namespace
std;
#define min_2(a,b) ((a#define min_3(a,b,c) min_2(min_2(a,b),min_2(a,c))
#define null (0)
/** @brief min_array_heap
* * 最小根堆 最大的作用是從huge資料中找到最小的元素
* 也可以排序
* ** */
template
class min_array_heap ;
//從i節點開始往下調整,調整到第end個節點,序號從0開始
void shiftdown(type* array, int start, int end) else
swap(array[lchild],array[start]);
} else
}#else
//如果右子超範圍了,只比較左子和父親
if(rchild >= end)
} //否則都要比較
else
if (min == array[rchild])
}#endif
start = lchild;
lchild = 2* start + 1;
rchild = 2* start + 2;}};
//遞迴版本
void shiftdown_regression(type* array, int start, int end)
//最後乙個無右子,交換左子與父親即可
if(lchild == end)
int offset = mini_operation(array,start,lchild, rchild);
//offset = 0,從左子開始調整
if (offset == 0) else
}//最小堆操作,將父親,左子,右子調整好,
//返回偏移是該往左(0),還是往右(1)
int mini_operation(type* array, int father, int lchild , int rchild)
if (min == array[rchild])
};public:
min_array_heap(): m_array(0),m_size(0){};
min_array_heap(const type array, int size): m_size(size) ;
~min_array_heap();
min_array_heap(const min_array_heap & array) ;
min_array_heap & operator=(const min_array_heap & array) ;
const type & operator(int pos) ;
int get_size()
type get_min_node()
//堆初始化
void update()
void update_reg()
//從pos往根結點逐個調整
void update(int pos)
void insert_item(const type & item ) ;
void insert_item_faster(const type & item )
};int fetch_root(type* item) else
};void order()
};void print_array()
cout
<< "\n";
};};/**
* @brief main
* @param argc
* @param argv
* @return
*/int main (int argc , char* argv)
; srand((int)time(0));
cout
<< "original:\n";
for(int i =0;i < size; i ++)
cout
<< "\n";
cout
<< "in mini_heap:\n";
min_array_heap mheap(a,size);
mheap.print_array();
int tmp;
mheap.fetch_root(&tmp);
cout
<< "fetch_root: "
<< tmp << "\t"
<< endl;
mheap.print_array();
//cout << "normal insert:\n";
tmp = 10;
cout
<< "faster insert:\n";
mheap.insert_item_faster(tmp);
mheap.print_array();
cout
<< "mini_heap order:\n";
mheap.order();
mheap.print_array();
min_array_heap mheap_t = mheap;
//while(mheap_t.get_size())
//cout << "normal insert:\n";
//cout << "faster insert:\n";
cin.get();
//delete a;
return
0;}
小根堆 陣列實現
特點 父節點永遠比孩子節點小,不強制要求左孩子比右孩子小,但是為了實現方便,我令其左孩子比右孩子小。反之為大根堆。push 插入元素 陣列長度增加 注意 增加的不是本次插入所需要的位置,而是下次元素的位置,這句話能解釋為什麼pop的時候需要 se才能拿到當前堆中的最後乙個元素 從下往上判斷是否滿足小...
C 大根堆與小根堆
c 中,大根堆和小根堆可以使用優先佇列實現。include priority queuepq1 大根堆 priority queue,greater pq2 小根堆該stl支援自定義比較函式,但與sort不同,不支援直接使用lambda函式。自定義的小根堆如下。struct cmp 自定義小根堆 p...
c語言實現小根堆
小根堆的實現 邏輯模型是乙個完全二叉樹 儲存模型是給vector 索引下標從0開始 1 如果i 0,結點i是根結點,無父結點 否則結點i的父結點為結點 i 1 2 2 如果2i 1 n 1,則結點i無左子女 否則結點i的左子女為結點2i 1 3 如果2i 2 n 1,則結點i無右子女 否則結點i的右...