前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

作者头像
对弈
发布2019-09-04 15:48:25
3400
发布2019-09-04 15:48:25
举报
代码语言:javascript
复制
//数据结构-堆,用C++类实现,这里以小顶堆为例,所谓的堆,是一种以完全二叉树为基础的数据结构,二话不说,上代码;

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<list>

using namespace std;
点击并拖拽以移动
点击并拖拽以移动
代码语言:javascript
复制
class Heap
{
    size_t maxsize;
    size_t len;
    int *arr;
public:
    Heap() :maxsize(10), len(0), arr(new int[maxsize]){}
    ~Heap()
    {
        if (arr != nullptr)
        {
            delete arr;
            arr = nullptr;
            maxsize = len = 0;
        }
    }
    void insert(int data)
    {
        if (maxsize < len)//内存不足够
        {
            maxsize += (maxsize >> 1)>1 ? maxsize >> 1 : 1;
            int *temp = new int[maxsize];

            if (arr != nullptr)
            {
                memcpy(temp, arr, sizeof(int)*len);
                delete[]arr;
                arr = temp;
            }
            arr[len++] = data;
            size_t index = len - 1;//data的下标
            int mytemp;
            while (index > 0)//不是根节点
            {
                //父节点的下标   (index-1)/2
                if (arr[index] < arr[(index - 1) / 2])//父节点大于儿子
                {
                    //父节点大于儿子 交换
                    mytemp = arr[index];
                    arr[index] = arr[(index - 1) / 2];
                    arr[(index - 1) / 2] = mytemp;

                    index = (index - 1) / 2;//继续往上调整
                }
                else
                {
                    break;
                }
            }
        }
    }

    int pop()//删除
    {
        if (arr == nullptr || len == 0) throw"heap is NULL";
        int mytemp = arr[0];
        size_t index, index1, index2, temp;
        arr[0] = arr[--len];
        index = 0;
        while (index < len)
        {
            index1 = index * 2 + 1;//左孩子
            index2 = index * 2 + 2;//右孩子
            //  1.有右孩子 必定会有左孩子
            //  2.有左边未必有右孩子
            if (index1 >= len)
                break;

            else if (index2 >= len)
            {
                if (arr[index1] < arr[index])
                {
                    //左孩子调整上去
                    temp = arr[index];
                    arr[index] = arr[index1];
                    arr[index1] = temp;
                }
                break;//
            }
            else//左右孩子都有
            {
                if (arr[index1] > arr[index2])//左孩子大于右孩子
                {
                    //放右孩子上去
                    temp = arr[index];
                    arr[index] = arr[index2];
                    arr[index2] = temp;
                    //然后对右边进行调整
                    index = index2;//右孩子作为新的要调整的位置
                }
                else//左孩子小于右孩子
                {
                    temp = arr[index];
                    arr[index] = arr[index1];
                    arr[index1] = temp;
                    index = index1;//左孩子
                }
            }
        }
        return mytemp;
    }

};

int main()
{
    srand((unsigned)time(nullptr));
    Heap myheap;
    for (int i = 0; i < 10; ++i)
    {
        int x=rand() % 100;
        myheap.insert(x);
    }
    for (int i = 0; i < 10; ++i)
    {
        cout << myheap.pop() << '\t';
    }

    cin.get();
    return 0;
}

声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/c%e5%ae%9e%e7%8e%b0%e9%9b%b7%e9%9c%86%e6%88%98%e6%9c%ba-54/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档