A*寻路算法打开列表二叉堆代码整理

using System;

namespace BinaryHeaps
{
    public class BinaryHeaps
    {
        int[] fCost = new int[1];// 二叉堆 开启列表F值花费 数组索引标志该F值对应数据的索引标志
        int numberOfOpenListItems; // 总共长度 同时对应fCost最后的索引

        /// <summary>
        /// 自动扩大数组长度
        /// </summary>
        void checkArrayLeght()
        {
            if (fCost.Length > numberOfOpenListItems * 2)
                return;
            int[] temp = new int[fCost.Length * 2];
            for (int i = 1; i < fCost.Length; i++)
            {
                temp[i] = fCost[i];
            }
            fCost = temp;
        }

        /// <summary>
        /// 插入数据
        /// </summary>
        /// <param name="id"></param>
        public void insert(int id)
        {
            ++numberOfOpenListItems;
            checkArrayLeght();
            fCost[numberOfOpenListItems] = id;
            // 上浮
            rise(numberOfOpenListItems);
        }

        /// <summary>
        /// 删除堆顶
        /// </summary>
        public void deleteFist()
        {
            if (numberOfOpenListItems == 0)
                return;
            fCost[1] = fCost[numberOfOpenListItems];
            fCost[numberOfOpenListItems] = 0;
            --numberOfOpenListItems;
            //下沉
            sink(1);
        }

        /// <summary>
        /// 上浮
        /// </summary>
        /// <param name="index"></param>
        void rise(int index)
        {
            if (index == 1)
            {
                return;
            }
            int parentIndex = index / 2;
            //如果父节点比该节点大交换节点
            if (fCost[parentIndex] > fCost[index])
            {
                int temp = fCost[parentIndex];
                fCost[parentIndex] = fCost[index];
                fCost[index] = temp;
                rise(parentIndex);
            }
        }

        /// <summary>
        /// 下沉
        /// </summary>
        /// <param name="index"></param>
        void sink(int index)
        {
            int leftChild = index * 2;
            int rightChild = index * 2 + 1;
            // 与左子节点和右子节点小的那个节点交换
            if (fCost[leftChild] <= fCost[rightChild] && fCost[leftChild] != 0 && fCost[leftChild] < fCost[index])
            {
                int temp = fCost[leftChild];
                fCost[leftChild] = fCost[index];
                fCost[index] = temp;
                sink(leftChild);
            }
            else if (fCost[rightChild] != 0 && fCost[rightChild] < fCost[index])
            {
                int temp = fCost[rightChild];
                fCost[rightChild] = fCost[index];
                fCost[index] = temp;
                sink(rightChild);
            }

        }
        public void Print()
        {
            for (int i = 1; i < numberOfOpenListItems + 1; i++)
            {
                Console.Write(fCost[i] + " ");
            }
            Console.WriteLine();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            BinaryHeaps binaryHeaps = new BinaryHeaps();
            binaryHeaps.insert(17);
            binaryHeaps.Print();
            binaryHeaps.insert(20);
            binaryHeaps.Print();
            binaryHeaps.insert(30);
            binaryHeaps.Print();
            binaryHeaps.insert(15);
            binaryHeaps.Print();
            binaryHeaps.insert(5);
            binaryHeaps.Print();
            binaryHeaps.insert(40);
            binaryHeaps.Print();
            binaryHeaps.insert(18);
            binaryHeaps.Print();
            binaryHeaps.insert(5);
            binaryHeaps.Print();
            binaryHeaps.deleteFist();
            binaryHeaps.Print();
        }
    }
}

https://blog.csdn.net/u013681996/article/details/39080881
根据这篇文章总结的A*寻路算法打开列表二叉堆代码整理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值