#堆排序要点(一维数组和完全二叉树)记住
1.找到最后一个非叶子节点n/2-1
2.知道左右子树的节点编号arr[i]=2i+1 arr[i]=2i+2
//堆排序
#include<iostream>
#include<vector>
using namespace std;
void duip(vector<int>&v)
{
if(v.size()==0)return;
for(int j=v.size();j>=2;j--)//长度
{
for(int i=j/2-1;i>=0;i--)//从最后一个非叶子节点开始
{
if(2*i+1<j&&v[2*i+1]>v[i])//左节点
{
int temp=v[2*i+1];
v[2*i+1]=v[i];
v[i]=temp;
}
if(2*i+2<j&&v[2*i+2]>v[i])//右节点
{
int temp=v[2*i+2];
v[2*i+2]=v[i];
v[i]=temp;
}
}
int tmp=v[0];
v[0]=v[j-1];
v[j-1]=tmp;
}
}
void printT(vector<int>v)
{
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<" ";
}
cout<<endl;
}
int main()
{
vector<int>v={3,4,6,1,7,2};
printT(v);
duip(v);
printT(v);
system("pause");
return 0;
}