#include <stdio.h>
/*
*如果父节点的值小于左右孩子中的最大值,则交换父节点的值和左右孩子中的最大值
*/
void heapify(int arr[], int i, int size)
{
if(i < size){
int left = 2 * i + 1;//左孩子
int right = 2 * i + 2;//右孩子
int largest = i;//父节点
//找出父节点和左右孩子中的最大值
if(left < size){
if(arr[largest] < arr[left])
largest = left;
}
if(right < size){
if(arr[largest] < arr[right])
largest = right;
}
if(largest != i){
//如果最大值不是父节点本身,则交换最大值到父节点
int tmp = arr[i];
arr[i] = arr[largest];
arr[largest] = tmp;
//继续向下一个子树执行该操作
heapify(arr, largest, size);
}
}
return;
}
/*
*建立最大堆
*当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。
*当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。
*/
void heap_max(int arr[], int size)
{
int i;
for(i = size - 1;i >= 0;--i){
//确保每颗子树的父节点的值是最大的
heapify(arr, i, size);
}
return;
}
/*
*堆排序
*获取最大堆后,交换根节点的值和最后一个值
*/
void heap_sort(int arr[], int size)
{
int i;
for(i = size - 1;i >= 0;--i){
//获取最大堆
heap_max(arr, i+1);
//交换根节点的值和最后一个值
int tmp = arr[i];
arr[i] = arr[0];
arr[0] = tmp;
}
return;
}
int main(void)
{
int arr[10] = {12, 22, 33, -9, 1, 90, 29, 93, 88, 10};
//heap_max(arr, 10);
heap_sort(arr, 10);
int i;
for(i = 0;i < 10;++i)
printf("%d,", arr[i]);
return 0;
}
记录一下自己实现的堆排序
最新推荐文章于 2022-08-21 21:58:06 发布