#include<iostream>
#include<ctime>
using namespace std;
template<typename T>
void heap_swap(T&a,T&b);
template<typename T>
void Heap_big_update(T*input_array,int length,int index);
template<typename T>
void Heap_big_sort(T*input_array,int length);
void printArray(auto*input_array,int length);
int main(){
int input_array[10] = {5,4,9,3,0,7,8,9,1,13};
cout<<"原始数据:"<<endl;
printArray(input_array,10);
cout<<"排序过程:"<<endl;
clock_t t = clock();
Heap_big_sort<int>(input_array,10);
t = clock() - t;
cout<<"排序Done!time:"<<float(t)/CLOCKS_PER_SEC<<"s"<<endl;
cout<<"排序结果:"<<endl;
printArray(input_array,10);
}
template<typename T>
void Heap_big_sort(T*input_array,int length){
//先将输入array初始化成大顶堆
for(int i = (length/2)-1;i>=0;i--){
Heap_big_update<T>(input_array,length,i);
}
for(int i = length-1;i>0;i--){
heap_swap<T>(input_array[0],input_array[i]);
Heap_big_update<T>(input_array,i,0);
printArray(input_array,length);
}
}
template<typename T>
void Heap_big_update(T*input_array,int length,int root_index){
if(root_index<0||root_index>=length)throw"Index error!";
int left_index = 2*root_index+1;
int right_index = 2*root_index+2;
int max_index = root_index;
//搜寻父节点与左子树 右子树 三个之间最大值的index
if(input_array[max_index]<input_array[left_index]&&left_index<length){
max_index = left_index;
}
if(input_array[max_index]<input_array[right_index]&&right_index<length){
max_index = right_index;
}
//如果父节点不是最大的 则进行交换
if(max_index!=root_index){
//判断最大值是左子树还是右子树
if(max_index ==left_index){
heap_swap<T>(input_array[max_index],input_array[root_index]);
//将左子树与父节点交换后父节点的顺序是正确的,但是被交换后左子树节点的顺序发生了改变,需要对该节点进行更新
Heap_big_update<T>(input_array,length,left_index);
}
else{
heap_swap<T>(input_array[max_index],input_array[root_index]);
//将右子树与父节点交换后父节点的顺序是正确的,但是被交换后右子树节点的顺序发生了改变,需要对该节点进行更新
Heap_big_update<T>(input_array,length,right_index);
}
}
}
template<typename T>
void heap_swap(T&a,T&b){
T temp = 0;
temp = a;
a = b;
b = temp;
}
void printArray(auto*input_array,int length){
for(int i = 0;i<length;i++){
cout<<input_array[i]<<"\t";
}
cout<<endl;
}