堆排序手撕
#include <iostream>
#include <vector>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <map>
#include <set>
#include <unordered_map>
using namespace std;
void rebuild(vector<int>& v,int p,int n)
{
while(p<=n/2)
{
int mark;
if(2*p<n && v[2*p+1]>v[2*p])
{
mark=2*p+1;
}
else
{
mark=2*p;
}
if(v[mark]>v[p])
{
swap(v[mark],v[p]);
p=mark;
}
else
{
break;
}
}
}
int main()
{
vector<int> v{26,5,77,1,61,11,59,15,48,19};
int len=v.size();
for(int i=len/2-1;i>=0;i--)
{
rebuild(v,i,len-1);
}
for(int i=len-1;i>=0;i--)
{
swap(v[0],v[i]);
rebuild(v,0,i-1);
}
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<" ";
}
}