堆的基本操作

堆实际上是一棵完全二叉树,其任何一个非叶节点满足:

arr[i]<=arr[2*i+1]&&arr[i]<=arr[2*i+2];(小顶堆);
arr[i]<=arr[2*i+1]&&arr[i]<=arr[2*i+2];(大顶堆);

下面是一个大顶堆的操作。

  • 插入一个元素时
    //插入一个元素时,将其插入堆的尾部,让后向上冒泡
    public static void heapInsert(int[] arr,int index)
    {
        while (index!=0)
        {
            int parent=(index-1)/2;
            if (arr[parent]<arr[index])
                swap(arr,index,parent);
            else
                break;
            index=parent;
        }
    }
  • 堆化
    //堆化,向下渗透
    public static void heapify(int[] arr,int index,int size)
    {
        int left=2*index+1;
        int right=2*index+2;
        int best=index;
        while (left<size)
        {
            if (arr[left]>arr[index])
            {
                best=left;
            }
            if (right<size&&arr[right]>arr[best])
            {
                best=right;
            }
            if (best!=index)
            {
                swap(arr,best,index);
            }
            else
                break;
            index=best;
            left=2*index+1;
            right=2*index+2;
        }
    }
  • 删除堆中的最大值
    //删除堆中的最大值
    public static void deleteMax(int[] arr,int size)
    {
        //把最大值和数组尾部元素互换
        swap(arr,0,size-1);
        //数组尾部元素设为-1
        arr[--size]=-1;
        //堆化
        heapify(arr,0,size);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容