zoukankan      html  css  js  c++  java
  • 数据结构-堆-堆维护-130. 堆化

    2020-04-01 08:15:56

    问题描述:

    给出一个整数数组,堆化操作就是把它变成一个最小堆数组。

    对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[i]的右儿子。

    样例

    输入 : [3,2,1,4,5]
    输出 : [1,2,3,4,5]
    解释 : 返回任何一个合法的堆数组

    挑战

    O(n)的时间复杂度完成堆化

    问题求解:

    由于堆有一个性质就是其是完全二叉树,那么我们就可以从非叶子节点开始向下过滤,具体的操作就是从上往下将最小的置为根。

    通过对每次过滤的节点数的估算,即n / 2 + n / 4 + ... + 1 = n。

    时间复杂度:O(n)

        public void heapify(int[] A) {
            for (int i = A.length / 2; i >= 0; i--) {
                siftdown(A, i);
            }
        }
        
        private void siftdown(int[] A, int idx) {
            if (idx >= A.length) return;
            int k = idx;
            if (idx * 2 + 1 < A.length && A[idx * 2 + 1] < A[k]) k = idx * 2 + 1;
            if (idx * 2 + 2 < A.length && A[idx * 2 + 2] < A[k]) k = idx * 2 + 2;
            if (k == idx) return;
            int temp = A[idx];
            A[idx] = A[k];
            A[k] = temp;
            siftdown(A, k);
        }
    

      

  • 相关阅读:
    *洛谷P1858 多人背包
    ZOJ3469 Food Delivery
    Hdu5115 Dire Wolf
    Codevs 2765 隐形的翅膀
    Hdu4055 Number String
    Codevs 1300 文件排版
    洛谷 P1412 经营与开发
    Codevs 4357 不等数列
    codevs 3333 高级打字机
    Bzoj 1086: [SCOI2005]王室联邦
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/12610178.html
Copyright © 2011-2022 走看看