c 小根堆陣列實現

2021-08-03 10:00:58 字數 3423 閱讀 8833

主要功能

最小堆排序(大到小):

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的右...