代码:
#include<stdio.h>
void Adjust(int *arr, int start, int end)
{
int tmp = arr[start];
for (int i = 2 * start + 1;i <= end; i = 2 * i + 1)
{
//判断是否有右孩子
if (i < end && arr[i] < arr[i + 1])
{
i++;
}
if (arr[i] > tmp)
{
arr[start] = arr[i];
start = i;
}
}
arr[start] = tmp;
}
void Heap_Sort(int *arr, int len)
{
for (int i = (len - 1 - 1) / 2;i >= 0;i--)
{
Adjust(arr, i, len - 1);
}
//大根堆
//交换
int tmp = 0;
for (int j = 0;j < len - 1;j++)
{
tmp = arr[0];
arr[0] = arr[len - 1 - j];
arr[len - 1 - j] = tmp;
Adjust(arr, 0, len - 1 - j - 1);
}
}
void Print(int *arr, int len)
{
for (int i = 0;i < len;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {89,12,45,0,74,32,17,20,65,53,5,12};
int len = sizeof(arr) / sizeof(arr[0]);
Print(arr,len);
Heap_Sort(arr,len);
Print(arr, len);
return 0;
}