思想:将数组转为二叉树,调整为最大堆,然后将第一个数与末尾数交换,在调整最大堆,重复步骤
#include <stdio.h>
//输出
void print(int array[], int size)
{
int i = 0;
for(i = 0; i < size; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
//两数交换
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//调整最大堆
void maxHeapify(int array[], int i, int size)
{
int left = i * 2 + 1; //采用索引值计算,数组第一个下标从0开始
int right = i * 2 + 2;
int max_index = 0;
if(right >= size || left >= size) //大于数组大小返回
{
return;
}
//比较出根、左节点、右节点最大的
if(array[left] > array[i])
{
max_index = left;
}
else
{
max_index = i;
}
if(array[right] > array[max_index])
{
max_index = right;
}
//如果最大的不为根节点,则进行交换,
//并对进行交换的子节点进行对调整
if(max_index != i)
{
swap(&array[i], &array[max_index]);
maxHeapify(array, max_index, size);
}
}
//建立最大堆
void build_max_heap(int array[], int size)
{
//计算第一个根节点的下标
int index = (size - 2) / 2;
int i = 0;
//从下往上进行根节点遍历
for(i = index; i > -1; i--)
{
maxHeapify(array, i, size);
}
}
void heap_sort(int array[], int size)
{
//建立最大堆
build_max_heap(array, size);
while(size != 1)
{
//交换第一个节点和最后一个节点
swap(&array[0], &array[size - 1]);
//堆大小减一,因为最后一个数为最大,为已排序的数
size--;
//调整堆
maxHeapify(array, 0, size);
}
}
int main()
{
int array[] = {23, 45, 2, 54, 34, 3, 67, 234, 3, 67, 57};
heap_sort(array, 11);
int i = 0;
print(array, 11);
return 0;
}