堆的实现。

堆的初始化

void HeapInit(HP* php)
{
    assert(php);

    php->a=NULL;
    php->capacity=php->size=0;

}

堆的打印

void HeapPrint(HP* php)
{
    assert(php);
    
    for(int i = 0;i < php->size;i++)
    {
        printf("%d ",php->a[i]);
    }
    printf("\n");
}

堆的销毁

void HeapDestroy(HP* php)
{
    assert(php);

    free(php->a);
    php->a=NULL;
    php->size=php->capacity=0;
}

堆的插入

void HeapPush(HP* php,HPDataType x)
{
    assert(php);

    if(php->size==php->capacity)
    {
        int newCapacity=php->capacity==0?4:php->capacity*2;
        HPDataType* tmp=(HPDataType*)realloc(php->a,sizeof(HPDataType)*newCapacity);
        if(tmp == NULL)
        {
            perror("realloc fail");
            exit(-1);
        }
        php->a=tmp;
        php->capacity=newCapacity;

    }
    php->a[php->size]=x;
    php->size++;
    AdjustUP(php->a,php->size-1);
}

向上调整接口

void AdjustUP(HPDataType* a,int child)
{
    int parent = (child-1)/2;
    while(child>0)
    {
        if(a[child]>a[parent])
        {
            Swap(&a[child],&a[parent]);
            child=parent;
            parent=(child-1)/2;
        }
        else
        {
            break;
        }
    }
}

堆的元素删除

void HeapPop(HP* php)
{
    assert(php);
    assert(php->size>0);

    Swap(&php->a[0],&php->a[php->size-1]);
    php->size--;
    AdjustDown(php->a,php->size,0);

}

向下调整接口

void AdjustDown(HPDataType* a,int n,int parent)
 {
    int child = parent*2+1;
    while(child<n)
    {
        if((child+1)<n && a[child]<a[child+1])
        {
            ++child;
        }
        if(a[parent]<a[child])
        {
            Swap(&a[parent],&a[child]);
            parent=child;
            child=parent*2+1;
        }
        else
        {
            break;
        }
    }
 }

测试

void TestHeap()
{
    int array[]={27,15,19,18,28,34,65,49,25,37};
    HP hp;
    HeapInit(&hp);
    for(int i=0;i<sizeof(array)/sizeof(int);i++)
    {
        HeapPush(&hp,array[i]);
    }
    HeapPrint(&hp);
    HeapDestroy(&hp);
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用和引用提供了两种不同的Dijkstra算法的实现方式。引用中的代码使用了Floyd算法来计算最短路径,而引用中的代码则使用了朴素版的Dijkstra算法。 Floyd算法是一种通过动态规划的方式计算最短路径的算法。它使用了三个嵌套的for循环来更新每对节点之间的最短路径。算法首先将所有节点之间的距离初始化为无穷大,然后通过遍历每个节点对及中间节点,更新节点之间的距离。最后,如果起始节点和终止节点之间存在路径,则输出最短路径的长度;否则,输出-1表示没有路径存在。 朴素版的Dijkstra算法也是一种计算最短路径的算法。它使用了一维数组来记录起始节点到每个节点的最短距离,并使用另一个数组来记录节点是否已经被访问过。算法首先将起始节点到所有其他节点的距离初始化为无穷大,并将起始节点标记为已访问。然后,遍历N次,每次选择距离起始节点最近且未被访问过的节点,并更新该节点相邻节点的最短距离。最后,如果终止节点的最短距离为无穷大,则输出-1表示没有路径存在;否则,输出终止节点的最短距离。 由于问题中没有明确指定使用哪种算法来实现Dijkstra算法,你可以根据具体的需求选择合适的算法来实现实现的Dijkstra算法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [优化dijkstra算法](https://blog.csdn.net/qq_46188283/article/details/107707615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值