堆排序详解

堆排序分为大顶堆和小顶堆,依然用数组来进行存储;大顶堆指每一个节点的值都大于其子节点,反之则为小顶堆。因此使用堆排序时需要先创建大顶堆(降序)或者小顶堆(升序)。
实现逻辑: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;
}

运行结果如图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值