void print(vector<int>& arr){
for(auto ele : arr)
cout<<ele<<" ";
cout<<endl;
}
void maxHeapify(int i, vector<int>& arr, int n){
vector<int> arr = this->arr;
int left = 2*i + 1 , right = 2*i+2;
int largest = i;
if( left < n && arr[left] > arr[largest])
largest = left;
if(right < n && arr[right] > arr[largest])
largest = right;
if(largest != i){
swap(arr[largest] , arr[i]);
maxHeapify(largest, arr , n);
}
}
void formMaxHeap(vector<int>& arr){
int n = arr.size();
int r = (n/2) -1;
for(int i = r; i>=0; i--){
maxHeapify(i, arr, n);
}
}
int extract_max(vector<int>& arr){
int val = arr.front();
swap(arr.front(), arr.back());
arr.pop_back();
int size= arr.size();
maxHeapify(0, arr, size);
return val;
}
void heapSort(vector<int>& arr){
int n = arr.size() ;
formMaxHeap(arr);
for(int r = n-1 ; r > 0 ; r--){
swap(arr[0], arr[r]);
maxHeapify(0, arr, r );
}
}