大堆和小堆的實現

2021-08-14 21:15:31 字數 2752 閱讀 7948

堆的概念

如果有乙個關鍵碼的集合,將這個集合中的所有元素按照完全二叉樹的順序儲存在乙個一維陣列中,並滿足最小堆或最大堆的性質。

最小堆:任一結點的關鍵碼均小於等於它的左右孩子的關鍵碼,其中堆頂的元素最小。(任一路徑中的元素降序排列)

最大堆:任一結點的關鍵碼均大於等於它的左右孩子的關鍵碼,其中堆頂的元素最大。(任一路徑中的元素公升序排列)

一、堆的建立(以最小堆為例)

堆的建立按照完全二叉樹建立,底層是vector結構,儲存的時候按照完全二叉樹建立,從倒數第乙個葉子結點開始到根結點對當前堆進行向下調整。

//建立最小堆--->時間複雜度o(nlog2n)

heap(const t* array, size_t size)

_array.resize(size);//底層用vector搭載,插入元素後調整vector的大小

//找完全二叉樹中倒數第乙個非葉子結點

int root = (size - 2) >> 1;

for (; root >= 0; root--)

_adjustdown(root);//向下調整,從第乙個非葉子結點到根結點調整

}

二、堆的插入

堆的插入在以建成的最小堆的後面插入,插入後,有可能破壞了堆的結構,從第乙個非葉子結點的位置開始到根節點,對當前堆進行向上調整。

//插入元素

void insert(const t& data)

三、堆的刪除

堆的刪除是刪除堆頂元素。

方法一:刪除堆頂元素後,將堆中的其他元素向前搬移,但可行性差,調整次數多,可能破壞了堆的性質。

方法二:堆中最後乙個元素與堆頂元素進行替換,刪除最後乙個元素,從堆頂開始,對堆進行向下調整。

//刪除元素

void delete()

//堆中含有多個元素

else

}

封裝調整函式

//向下調整

void _adjustdown(size_t proot)

else

break;

} }//向上調整

void _adjustup(size_t proot)

else

break;

} }

但這只是針對於小堆的情況,如何將乙個小堆改為大堆呢?

利用仿函式來實現

template struct less

};template struct greater

};template >

class heap

//建立最小堆--->時間複雜度o(nlog2n)

heap(const t* array, size_t size)

_array.resize(size);//底層用vector搭載,插入元素後調整vector的大小

//找完全二叉樹中倒數第乙個非葉子結點

int root = (size - 2) >> 1;

for (; root >= 0; root--)

_adjustdown(root);//向下調整,從第乙個非葉子結點到根結點調整

} //插入元素

void insert(const t& data)

//刪除元素

void delete()

//堆中含有多個元素

else

}private:

//向下調整

void _adjustdown(size_t proot)

else

break;

} }//向上調整

void _adjustup(size_t proot)

else

break;

} }private:

vector_array;

};

也改為模板的模板引數

template struct less

};template struct greater

};template class compare=less>

class heap

//建立最小堆--->時間複雜度o(nlog2n)

heap(const t* array, size_t size)

_array.resize(size);//底層用vector搭載,插入元素後調整vector的大小

//找完全二叉樹中倒數第乙個非葉子結點

int root = (size - 2) >> 1;

for (; root >= 0; root--)

_adjustdown(root);//向下調整,從第乙個非葉子結點到根結點調整

} //插入元素

void insert(const t& data)

//刪除元素

void delete()

//堆中含有多個元素

else

}private:

//向下調整

void _adjustdown(size_t proot)

else

break;

} }//向上調整

void _adjustup(size_t proot)

else

break;

} }private:

vector_array;

};

c 實現最大堆和最小堆

堆是具有以下特性的完全二叉樹,每個結點的值都大於或等於其左右孩子結點的值,叫做最大堆 每個結點的值都小於或等於其左右孩子結點的值,叫做最小堆。vector int nums 1 如果使用nums構建最大堆 make heap nums.begin nums.end 或 make heap nums....

最大堆和最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...

最大堆和最小堆

最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。最小堆 根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。最小堆和最大堆的增刪改相似,其實就是把演算法中的大於改為小於,把小於改為大於。生成最大堆 最大堆通常都是一棵完...