美文网首页
堆的创建

堆的创建

作者: suntwo | 来源:发表于2019-05-26 14:00 被阅读0次

    二叉堆的定义

    堆通常由大根堆和小根堆,大根堆表示父节点大于字节点,小根堆相反
    eg:小根堆

            1
         2     3
      4   5 6    7
    8   9
    

    可以看出堆屎一个完全二叉树,我们通常使用数组进行存储,还有一些特点父节点是自己左孩子的二倍,是自己有孩子的二倍加1,可以表示为K=2k和K=2k+1,叶子节点有n/2个。

    堆的调整

    如果我们要调整一个大根堆,可以将根节点去掉,将最后一个叶子节点放入根节点,比较根节点左右孩子,选择大的一个和根节点比较,如果孩子节点最大的一个小于根节点,表示这个大根堆已经调整好,否则交换,再继续递归操作,直到调整完成或者到达叶子节点为止。

    堆的创建

    如果给出我们一个数字数组让我们进行堆的创建,我们需要找到最后一个非叶子节点,然后和自己的孩子节点比较,如果孩子节点大于父节点,进行交换,在交换后还是需要堆的调整的,直到到根节点。(最后一个非叶子节点为n/2)

    代码

    #include <stdio.h>
    #include <stdlib.h>
    //堆排序
    #define N 10
    int a[11]={0,4,2,8,3,7,2,8,0,4,7};
    
    //堆的调整   小根堆
    int tiaozheng(int flag)
    {
        if(2*flag<=N)
        {
            int c=minest(flag);
            if(a[c]<a[flag])
            {
                int temp;
                temp=a[c];
                a[c]=a[flag];
                a[flag]=temp;
                tiaozheng(c);   //堆调整
            }
        }
    }
    int minest(int n)
    {
        if(2*n+1>N)
            return 2*n;
        else
        {
            if(a[2*n]>a[2*n+1])
                return 2*n+1;
            else
                return 2*n;
        }
    }
    //初建堆
    int create()
    {
        int n=N/2;
        int i;
        for(i=n;i>0;--i)
        {
            int flag=minest(i);  //返回最小的下标
            if(a[i]>a[flag])
            {
                int temp;
                temp=a[i];
                a[i]=a[flag];
                a[flag]=temp;
                tiaozheng(flag);   //堆调整
            }
        }
    }
    int main()
    {
        create();
        for(int i=1;i<=10;++i)
            printf("%d\n",a[i]);
        return 0;
    }
    
    

    代码分析

    分为堆的创建和调整,在创建时需要进行调整。

    相关文章

      网友评论

          本文标题:堆的创建

          本文链接:https://www.haomeiwen.com/subject/ruwxtctx.html