《算法笔记》第4章 入门篇(2)---算法初步 9.7堆

9.7.1 堆的定义与基本操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

向下排序:大的数字上位,本身就要大的数字,本身会有右边的数字> 左边的数字,则j=j+1
向上排序:小的数字上位,本身就要小的数字, 数组本身就是左边的值<右边的值,则不用比较,直接就是左边的

调整堆函数:

//设置最大值maxn为100
//heap为堆,n为元素个数
/*
    1.对heap数组在[low,high]范围进行向下调整
    2.low为欲调整的结点的数组下标,high一般为数组中最后一个结点的下标
    3.void类型函数 downAdjust ,形参为int类型 low,high
    4.int类型 i为low,j为i*2(即为左孩子)
    5.while循环j<=high
        1.如果j在倒数第1位即之前,且j的右孩子>左孩子
        2.改变j的值为j+1
    6.如果孩子中最大的权值比欲调整结点的i大
        1.交换swap,俩个值
        2.将i的值改为j
        3.同时j的值改为i*2,表示此时i的左孩子
      否则
        1.直接退出循环

*/


const int maxn=100;
int heap[maxn],n=10;
void downAdjust(int low,int high)
{
    int i=low,j=i*2;          
    while(j<=high)
    {
        if(j+1<=high && heap[j+1]>heap[j])  //对于j而言,先比较左右最大的
        {
            j=j+1;
        }
        if(heap[j]>=heap[i])
        {
            swap(heap[i],heap[j]);
            i=j;
            j=i*2}
        else
        {
            break;
        }
    }
}

建堆:

在这里插入图片描述

//建堆
/*
    void类型函数 createHeap
        1.for,i从n/2开始,到i>=1,i--
        2.调用downAdjust函数,参数为i,n
*/

void createHeap()
{
    for(int i=n/2; i>=1; i--)
    {
        downAdjust(i,n);
    }
}

删除堆顶元素:

在这里插入图片描述

//删除堆顶元素j
void deleteTop()
{
    heap[1]=heap[n--];   //用最后一个元素覆盖堆顶元素,并让元素个数-1
    downAdjust(1,n);    //从1开始向下调整
}  

在堆中添加一个元素

在这里插入图片描述

//对heap数组在[low,high]范围进行向上调整
//其中low一般设置为1,high为欲调整的结点数组下标
/*
    void函数类型 upAdjust 形参为low high
    1.i的值为high,j的值为i/2表示父亲结点
    2.while循环:j>=low
        1.如果欲调整的下标i,比它老子大
        2.交换两个数
        3.将i改为j
        4.同时将j改为i的老子
    3.否则就退出


*/

/*
    添加元素x
    void函数类型:参数为int类型x
    1.对heap数组中,放入x
    2.调用upAdjust函数,从1~n

*/

void upAdjust(int low, int high)
{
    int i=high,j=i/2;
    while(j>=low)
    {
        if(heap[i]>heap[j])
        {
            swap(heap[i],heap[j]);
            i=j;
            j=i/2;
        }
        else
        {
            break;
        }
    }
}

void insert(int x)
{
    heap[++n]=x;
    upAdjust(1,n);
}

9.7.2 堆排序:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/*
    堆排序:
    void函数类型 heapSort
    1.调用createHeap()函数,建堆
    2.for循环,倒着枚举,直到堆中只有一个元素,i从n开始,一直到1
        1.调用swap函数,交换当前第i个元素和堆顶元素
        2.调用downAdjust函数,形参为1,i-1表示从堆顶元素,当前元素的前面向下调整堆

*/

void heapSort()
{
    createHeap();     
    for(int i=n; i>1; i--)
    {
        swap(heap[1],heap[i]);
        downAdjust(1,i-1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值