美文网首页
看到这个算法,一冲动就实现一下的体验

看到这个算法,一冲动就实现一下的体验

作者: honeyman | 来源:发表于2015-12-09 15:14 被阅读0次
    static void MaxHeapify(int a[], int i) {
        int left = i * 2 + 1;
        int right = (i * 2) + 2;
        
        if(left > a.length ||  right > a.length)
            return;
        
        int max;
        int tmp;
        if (a[left] > a[i])
            max = left;
        else
            max = i;
        
        if(a[right] > a[max])
            max = right;
        
        if(max != i)
        {
            tmp = a[max];
            a[max] = a[i];
            a[i] = tmp;
            MaxHeapify(a , max);
        }
        
    }
    
    public static void main(String[] args) {
        System.out.println("===============================");
        System.out.println("把已知左右子树为最大堆的堆调整为最大堆");
        System.out.println("以下为输入的堆:");
        int a[] = { 5, 10, 20, 6, 8, 11, 12 };
        System.out.println("                        " + a[0]);
        System.out.println("                " + a[1] + "              " + a[2]);
        System.out.println("           " + a[3] + "        " + a[4] + "       "
                + a[5] + "        " + a[6]);
    
        MaxHeapify(a, 0);
    
        System.out.println("===============================");
        System.out.println("调整后:");
        System.out.println("                        " + a[0]);
        System.out.println("                " + a[1] + "              " + a[2]);
        System.out.println("           " + a[3] + "        " + a[4] + "       "
                + a[5] + "        " + a[6]);
    }
    

    本想着很简单的算法结果一实现还出问题了,咦,这不对呀~

    遇到的问题如下:

    1.报错:java.lang.StackOverflowError 内存溢出

    百度之:可能是递归时是死循环,也可能是JVM虚拟机内存不够。
    看了一下代码,果然,函数没返回(¬_¬)
    改之。

    2.没报错,结果不对

    检查,发现原来数组下标从零开始啊,而书上的伪代码直接从1开始,所以搞错了。
    纠正,OK

    结果如下:

    Paste_Image.png

    相关文章

      网友评论

          本文标题:看到这个算法,一冲动就实现一下的体验

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