#include<iostream>
#include<time.h>
using namespace std;
const int AD = 6;
int arr[AD];
void initializeArray(int arr[], int n){
srand(time(0));
for(int i=0;i<n;i++){
arr[i] = rand()%400;
}
}
void swap(int& a, int&b){
int temp = a;
a = b;
b = temp;
}
void printArray(int arr[], int n){
for(int i=0; i<n; i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
//left, right are max heap, join arr[index] in
void max_heapify_recursive(int arr[], int heapSize, int index){
int left = (index <<1) +1;
int right = (index<<1) +2;
int largest = index;
if(left<heapSize && arr[left]>arr[index]){
largest = left;
}if(right<heapSize && arr[right] > arr[largest]){
largest = right;
}
if(largest != index){
swap(arr[largest],arr[index]);
max_heapify_recursive(arr,heapSize,largest);
}
}
void max_heapify_iterator(int arr[], int heapSize, int index){
int left = (index<<1)+1;
int right = (index<<1) +2;
int largest = index;
while(left<heapSize){// has child
if(left<heapSize && arr[left] > arr[index]){
largest = left;
}if(right<heapSize && arr[right] > arr[largest]){
largest = right;
}
if(largest == index){
break;
}else{
swap(arr[index],arr[largest]);
index = largest;
left = (index<<1)+1;
right = (index<<1)+2;
largest = index;
}
}
}
//max_heapify downward from the first internal node to 0
void build_max_heap(int arr[], int n){
for(int i= n/2-1; i>=0; i--){
max_heapify_iterator(arr,n,i);
}
}
void heapSort(int arr[], int n){
build_max_heap(arr,n);
int heapSize = n;
for(int i=n-1; i>0; i--){
swap(arr[i],arr[0]);
max_heapify_iterator(arr,--heapSize,0);
}
}
void main(){
initializeArray(arr,AD);
printArray(arr,AD);
//build_max_heap(arr,AD);
heapSort(arr,AD);
printArray(arr,AD);
}