#include<iostream>
#include<algorithm>
#include<vector>
int max_heapify(std::vector<int>& v, int i){
int l = 2*i;
int r = 2*i + 1;
int largest = 0;
if( (l < v.size()) && (v[l] > v[i]) ){
largest = l;
}
else{
largest = i;
}
if ( (r<v.size()) && (v[r] > v[largest]) ){
largest = r;
}
if ( largest != i){
std::swap(v[i], v[largest]);
max_heapify(v, largest);
}
return 0;
}
int build_max_heap(std::vector<int> &v){
for( int i = v.size()/2; i >= 0; i--){
max_heapify(v, i);
}
return 0;
}
int heap_sort(std::vector<int>& v){
build_max_heap(v);
int length = v.size();
for( int i = length-1 ; i>=1; i--)
std::swap(v[0], v[i]);
length--;
max_heapify(v, v[length]);
}
int main(){
std::vector<int> v = { 1, 2, 9, 8, 3, 4, 7, 6, 5};
heap_sort(v);
for(auto& e : v) std::cout<<e<<" ";
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dmVjdG9yPgoKaW50IG1heF9oZWFwaWZ5KHN0ZDo6dmVjdG9yPGludD4mIHYsIGludCBpKXsKCQoJaW50IGwgPSAyKmk7CglpbnQgciA9IDIqaSArIDE7CglpbnQgbGFyZ2VzdCA9IDA7CgkKCWlmKCAobCA8IHYuc2l6ZSgpKSAmJiAodltsXSA+IHZbaV0pICl7CgkJCgkJbGFyZ2VzdCA9IGw7Cgl9CgllbHNlewoJCWxhcmdlc3QgPSBpOwoJfQoJCglpZiAoIChyPHYuc2l6ZSgpKSAmJiAodltyXSA+IHZbbGFyZ2VzdF0pICl7CgkJbGFyZ2VzdCA9IHI7Cgl9CglpZiAoIGxhcmdlc3QgIT0gaSl7CgkJCgkJc3RkOjpzd2FwKHZbaV0sIHZbbGFyZ2VzdF0pOwoJCW1heF9oZWFwaWZ5KHYsIGxhcmdlc3QpOwoJfQoJCglyZXR1cm4gMDsKfQoKCmludCBidWlsZF9tYXhfaGVhcChzdGQ6OnZlY3RvcjxpbnQ+ICZ2KXsKCQoJZm9yKCBpbnQgaSA9IHYuc2l6ZSgpLzI7IGkgPj0gMDsgaS0tKXsKCQltYXhfaGVhcGlmeSh2LCBpKTsKCgl9CglyZXR1cm4gMDsKCQp9CgppbnQgaGVhcF9zb3J0KHN0ZDo6dmVjdG9yPGludD4mIHYpewoJYnVpbGRfbWF4X2hlYXAodik7CglpbnQgbGVuZ3RoID0gdi5zaXplKCk7Cglmb3IoIGludCBpID0gbGVuZ3RoLTEgOyBpPj0xOyBpLS0pCglzdGQ6OnN3YXAodlswXSwgdltpXSk7CglsZW5ndGgtLTsKCW1heF9oZWFwaWZ5KHYsIHZbbGVuZ3RoXSk7CgkKfQoKaW50IG1haW4oKXsKc3RkOjp2ZWN0b3I8aW50PiB2ID0geyAxLCAyLCA5LCA4LCAzLCA0LCA3LCA2LCA1fTsKaGVhcF9zb3J0KHYpOwoKZm9yKGF1dG8mIGUgOiB2KSBzdGQ6OmNvdXQ8PGU8PCIgIjsKCnJldHVybiAwOwkKfQ==