#include<iostream>
#include<stdio.h>
void my_print(int *arr,int length)
{
for(int i = 0; i < length; i++)
{
/* code */
printf("%d ",arr[i]);
}
printf("\n");
}
void heap_adjust(int *arr,int index,int length)
{
if (arr == NULL)
return ;
int left_child = 2 * index + 1 ;
int right_child = 2 * index + 2;
int current_idx = index;
if(left_child < length && arr[left_child] > arr[current_idx])
{
current_idx = left_child;
}
if (right_child < length && arr[right_child] > arr[current_idx]) {
current_idx = right_child;
}
if (index != current_idx) {
int temp = arr[current_idx];
arr[current_idx] = arr[index];
arr[index] = temp;
heap_adjust(arr,current_idx,length);
}
}
void heap_sort(int *arr,int length)
{
//初始化堆,将每个非叶子结点倒叙进行大顶堆调整。
//循环完毕 初始大顶堆(每个根结点都比它孩子结点值大)形成
for(int i = length/2 -1; i >= 0; --i)//堆的初始化,从第[n/2]个元素往前遍历
{
heap_adjust(arr,i,length);
}
for(int i = length - 1; i >= 0; --i)
{
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp; //取堆顶元素和堆最后一个元素交换,交换后可能不满足堆的性质,需要调整堆
heap_adjust(arr,0,i);//调整堆
}
return;
}
int main()
{
int arr[10] = { 6,8,2,3,9,7,4,1,5,10 };
my_print(arr,10);
heap_sort(arr,10);
my_print(arr,10);
return 0;
}