popHeap() ,adjustHeap()详见 C++数据结构--用向量数组实现大(小)根堆的插入和删除
1.对已经堆化的数组进行堆排序
2.向量堆化
堆化前的向量数组v{9,12,17,30,50,20,60,65,4,19}
堆化过程示意图
实现代码:
#include <iostream>
#include<vector>
#include<functional>
using namespace std;
/********以下省略****/
popHeap()
adjustHeap()
/********************/
template<typename T,typename compare>
//构建堆
void makeHeap(vector<T> &v,compare cp=compare())
{
int lastPos=v.size();
int prtPos=(lastPos-2)/2; //最后一个节点索引为lastPos-1,所以其父结点所以(lastPos-2)/2
while(prtPos>=0) //循环直到根结点索引
{
adjustHeap(v,prtPos,lastPos,cp); //调整堆v[prtPos,lastPos-1]
prtPos--;
}
}
template<typename T,typename compare>
/*堆排序 :
*v为任意向量数组堆
*/
void heapSort(vector<T> &v,compare cp=compare())
{
makeHeap(v,cp); //构建堆
for(int i=v.size();i>1;i--) //从后往前进行堆排序
popHeap(v,i,cp);
}
int main(int argc, char** argv)
{
vector<int> vec{9,12,17,30,50,20,60,65,4,19};
heapSort(vec,less_equal<int>());
for(int x:vec)
{
cout<<x<<ends;
}
return 0;
}
output:
65 60 50 30 20 19 17 12 9 4