堆排序分为大顶堆和小顶堆,依然用数组来进行存储;大顶堆指每一个节点的值都大于其子节点,反之则为小顶堆。因此使用堆排序时需要先创建大顶堆(降序)或者小顶堆(升序)。
实现逻辑:1.将无序的数据建立成大顶堆或者小顶堆。2。将堆顶元素与最后一个元素进行交换使最后一个元素最大或者最小,然后继续调整堆,再将堆顶元素与末尾元素交换,如此往复操作,直至排序完成。
详情可查看以下视频
https://www.bilibili.com/video/BV1GW411H7r7/?t=16.1
以无序数列{4,10,3,5,1}为例
#include <stdio.h>
//将数据进行交换函数
void swap(int* a, int* b)
{
int t = *b;
*b = *a;
*a = t;
}
//建立堆函数
void creat(int s[], int dad, int end)
{
int son = dad * 2 + 1;//dad为父节点son为子节点
while (son <= end)
{
if (son + 1 <= end && s[son] < s[son + 1])//遍历该节点的子节点
son++;
if (s[dad] > s[son])//如果父节点大于子节点则不进行操作
return;
else//父节点小于或者等于子节点是就进行交换
{
swap(&s[dad], &s[son]);
dad = son;
son = dad * 2 + 1;
}
}
}
void sort(int s[], int len)
{
int i;
for (i = len / 2 - 1; i >= 0; i--)//调用建立堆的函数
creat(s, i, len - 1);
for (i = len - 1; i > 0; i--)//对堆进行调整
{
swap(&s[0], &s[i]);
creat(s, 0, i - 1);
}
}
int main()
{
int s[] = {4,10,3,5,1};
int len = (int) sizeof(s) / sizeof(int);//数组的实际长度
sort(s, len);//调用函数进行排序
int i;
for (i = 0; i < len; i++)//将排序后的数据进行输出
printf("%d ", s[i]);
printf("\n");
return 0;
}
运行结果如图