#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
/**
* 大顶堆
**/
//插入节点时,将节点置于末尾arr[len++]=val,然后upAdjust(arr, 0, len)
void upAdjust(int * arr, int low, int high){
int i = high - 1, j = (i - 1) / 2;
while (j >= low){
if (arr[j] < arr[i]){
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
i = j;
j = (i-1) / 2;
}
else {
break;
}
}
}
//删除堆顶, arr[0] = arr[--len]; downAdjust(arr, 0, len)
void downAdjust(int * arr, int low, int high ){
int i = low, j = 2 * i + 1;
while (j < high){
if (j + 1 < high && arr[j+1] > arr[j]){
j = j + 1;
}
if (arr[i] < arr[j]){
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
i = j;
j = 2 * i + 1;
}
else {
break;
}
}
}
void createHeap(int * arr, int len){
for (int i = len / 2 - 1; i >= 0; i--){
downAdjust(arr, i, len);
}
}
void heapSort(int * arr, int len){
createHeap(arr, len);
for (int i = len - 1; i > 0; i--){
int tmp = arr[i];
arr[i] = arr[0];
arr[0] = tmp;
downAdjust(arr, 0, i);
}
}
int main(){
int src[4] = {5, 4, 0, 9};
heapSort(src, 4);
for (int i = 0; i < 4; i++)
cout << src[i] << " ";
cout << endl;
}