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

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

作者: 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