#include<iostream>
using namespace std;
void heapsort(int arr[], int length);
void heapinsert(int arr[], int length, int index);
void heapify(int arr[], int index, int heapsize);
void swap(int arr[],int i, int j);
void show(int arr[], int length);
template<class T>
int getLength(T& arr){
return sizeof(arr)/sizeof(arr[0]);
}
int main(){
int arr[] = {7,5,0,6,8,1,2};
int length = getLength(arr);
heapsort(arr,length);
show(arr, length);
return 0;
}
void heapsort(int arr[], int length){
//堆每个元素,让其向上调整,保证是一个大根堆
for(int i=0; i<length; i++){
heapinsert(arr, length, i);
}
int heapsize = length;
//调整好了之后,我把根上的元素换到最后面(最大值到了最后),然后主动缩减数组范围
//让其元素自上而下调整
swap(arr,0, --heapsize);
while(heapsize > 0){
heapify(arr, 0, heapsize);
swap(arr, 0,--heapsize);
}
}
void heapinsert(int arr[], int length, int index){
while(arr[index] > arr[(index-1)/2]){
swap(arr, index, (index-1)/2);
index = (index-1)/2;
}
}
void heapify(int arr[],int index, int heapsize){
int left = 2*index+1;
//当左节点没越界的时候
while(left < heapsize){
int largest =( (left+1)<heapsize && arr[left+1]>arr[left] )? left +1 : left;
largest = arr[largest]>arr[index]?largest:index;
if(largest == index)
break;
swap(arr, largest, index);
index = largest;
left = 2*index +1;
}
}
void swap(int arr[],int i, int j){
int temp = arr[i];
arr[i]= arr[j];
arr[j] = temp;
}
void show(int arr[], int length){
for(int i=0;i<length; i++){
cout << arr[i];
}
}