原理
构建最大堆,每次把极值移到未排序数组的最后一位,直至全部有序
手撕代码
void down(vector<int> &vec,int l,int j) //重建大顶堆
{
//排序 [l,r]
int i = l;
int temp = vec[i];
for(i = 2*i+1;i<=r;i = 2*i+1)
{
if(i+1<=r && vec[i]<vec[i+1])
i++;
if(vec[i]>temp)
{
vec[i] ^= temp; temp ^= vec[i]; vec[i] ^temp;
}else
break;
}
}
void conheap(vector<int> &vec,int l,int r) //构造大顶堆
{
int i = (r-1)/2;
for(;i>=0;i--)
{
down(vec,i,r);
}
}
void heapSort(vector<int> &vec)
{
int len = vec.size();
//构建堆
conheap(vec,0,len-1);
for(;len>1;len--)
{
//交换第一个和未排序最后一个
swap(vec[0],vec[len-1]);
down(vec,0,len-2);
}
}