堆排序

一、堆排序算法基本思想

利用最小堆(最大堆)的数据结构,利用待排序数据,建立最小/大堆每次取走堆顶的元素,然后将堆底的一个最后一个元素,放到堆顶,重整堆成为最小堆,然后再取走堆顶元素,以此类推......直到取完所有元素


二、堆排序的数据结构

堆的数据结构,不懂的可以看我另外一篇介绍最小堆的博客:最小堆

三、排序过程图解


四、算法源代码

#include<cstdio>
#define BLANK 100000

//待整理成最小堆的原始数据,下标从1开始,[0]为空
int list[] = {BLANK,49,38,65,97,76,13,27,49};

//最小堆原始数据量
int size = 8;

//根据根节点调整子堆
void heapAdjust(int heap[],int s,int t)
{
    //根节点值
    int rc = heap[s];
    //访问当前根节点的左子节点
    for(int i=2*s;i<=t;i*=2)
    {
        //如果左子节点大于右子节点,那么根节点和右节点比较
        //也就是要在根节点、左子节点、右子节点中找出
        //最小的值来替换当前根节点,以满足最小堆的条件
        if(i<t&&heap[i]>heap[i+1]) i++;

        //如果根节点小于左右子节点那么
        //说明子最小堆已经建好
        if(rc < heap[i]) break;
        //否则替换根节点
        heap[s] = heap[i];
        //保留原来根节点值要插入的地方
        s = i;
    }

    //原来根节点值移动到相应位置
    heap[s] = rc;
}

int main()
{
    //从底部开始建立堆
    for(int i= size/2;i>0;i--)
        heapAdjust(list,i,size);

    //每次从最小堆顶拿元素和
    //末尾数据交换位置
    //再次调整堆(1~i-1)结构
    //这就是堆排序
    for(int i=size;i>=1;i--)
    {
        int temp = list[1];
        printf("%d\n",temp);
        list[1] = list[i];
        list[i] = temp;
        heapAdjust(list,1,i-1);
    }
    return 0;

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值