堆排序算法(C)

目录

堆的概念

 堆排序的基本思想

节点

过程

1)调整序列使其变成大顶堆

2)堆排序

3)头文件以及主函数

4)运行结果


堆的概念

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:

 同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中。如下图:

 堆排序的基本思想

堆排序就是利用堆进行排序的方法。将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

节点

下标为i的节点的父节点下标:(i-1/2;

下标为i的节点的左孩子下标:i*2+1;

下标为i的节点的右孩子下标:i*2+2;

过程

1)调整序列使其变成大顶堆

就是从下往上、从右到左,将每个非叶节点当作根节点,将其和子树调整成大顶堆。

void mk_heap(int *src,int length,int i)
{
    int max = i;
    int lchild = i*2+1;
    int rchild = i*2+2;
    if(lchild < length && src[max] < src[lchild])
        max = lchild;
    if (rchild < length && src[max] < src[rchild])
        max = rchild;
    if(max != i)
    {
        int temp = src[max];
        src[max] = src[i];
        src[i] = temp;
        mk_heap(src,length,max);
    }
}

2)堆排序

就是先构建一个堆,用(1)对其调整为大顶堆,然后再让调整好后的大顶堆的根节点和最后一个节点换,并让最后的节点移走,然后递归。

void heap_sort(int *src,int length)
{
    int i;
    for(i=length/2-1;i>=0;i--)
        mk_heap(src,length,i);
    for(i=length-1;i>0;i--)
    {
        int temp = src[i];
        src[i] = src[0];
        src[0] = temp;
        mk_heap(src,i,0);
    }
}

3)头文件以及主函数

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{ 
    int i=0;
    int src[9] = {20,10,15,30,25,35,50,40,45};
    heap_sort(src,9);
    for (i = 0; i < 9; i++)
    {
        printf("%d ",src[i]);
    }
    printf("\n");
    return 0;
} 

4)运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值