/***********vector堆排序**************************/
/************************************************/
#include <iostream>
#include <vector>
using namespace std;
int elem; vector<int> item;
decltype(item.size()) num=0,ix;
vector<int> create(vector<int> item){ //构造大根堆(给出无序二叉堆)
decltype(item.size()) num=0,str=0;
for(auto ix:item){
num=str;
decltype(item.size()) p=(num-1)/2;
int temp=item[num];
while(1){
if(temp>item[p]){
item[num]=item[p];
num=p;
p=(p-1)/2;
}
else break;
}
item[num]=temp;
++str;
}
return item;
}
void answer(vector<int> item){ //得到大根堆
for(auto num:item)
cout<<num<<" ";
cout<<endl;
}
vector<int> delet(vector<int> item){ //大根堆删除元素
// for(auto ix:item){
// if(ix==elem) break;
// num++;
// }
// if(num==item.size()){
// findit=0;
// return item;
// }
swap(item[num],item[ix]);
// item.pop_back();
ix--;
int temp=item[num];
decltype(item.size()) l=2*num+1;
int left=item[l];
while(1){
if(l>ix) break;
if(l+1<=ix&&item[l]<item[l+1]) ++l;
if(temp>item[l]) break;
else{
item[num]=item[l];
num=l;
l=2*l+1;
}
}
item[num]=temp;
return item;
}
int main(){
cout<<"请输入一组待排序数: ";
while(cin>>elem){
if(elem==0) break;
item.push_back(elem);
}
item=create(item);
//answer(item); //初始大根堆
ix=item.size()-1;
while(1){
num=0;
if(num==ix) break;
item=delet(item);
// answer(item); //排序步骤
}
cout<<"排序结果为:";
answer(item);
return 0;
}