获取mergesort-tree的高度

时间:2017-05-31 09:25:32

标签: java recursion mergesort

我有mergesort算法的实现。如何计算树的高度?

到目前为止,我可以获得递归调用的数量,但不能获得树的高度:

static int swaps=0;
static long comparisons=0;
static int recursionsdepth=0;

public static int[] sort(int[] array) {

    recursionsdepth++;
    if (array.length > 1) {

        int middle = (int)(array.length / 2);

        int[] left = new int[middle];
        for (int i = 0; i <= left.length - 1; i++) {
            left[i] = array[i];
        }

        int[] right = new int[array.length - middle];
        for (int i = middle; i <= array.length - 1; i++) {
            right[i - middle] = array[i];
        }

        left = sort(left);
        right = sort(right);

        return merge(left, right);
    }
    else
    {  
        recursionsdepth--;
        return array;
    }
}

对于{1,5,7,9},递归调用为3({1,5,7,9}为1,{1,5}为1,{7,9}为1),但树的高度为2。 / p>

1 个答案:

答案 0 :(得分:1)

Merge Sort重复将数组分成两个相等(几乎)的部分,只要数组大小大于1.它不关心数组的初始状态,即即使数组是已经排序了。 现在,对于任何长度为n的给定数组,只有一种方法可以实现。因此,合并排序树的高度相对于n是恒定的。那就是高度将是 ceil(log n),其中base是2.你不需要实际运行程序就可以找到它。

由于在实际运行排序代码时,OP在计算高度时非常弯曲,所以它是:

将另一个变量传递给sort函数,该函数将存储当前节点的深度。并使用全局变量来存储迄今为止已实现的最大深度。下面的代码稍微修改了问题中的帖子:

static int swaps=0;
static long comparisons=0;
static int recursionsdepth=0;

public static int[] sort(int[] array, int depth) { // at first call depth = 0

    recursiondepth = Math.max(recursiondepth, depth);
    if (array.length > 1) {

        int middle = (int)(array.length / 2);

        int[] left = new int[middle];
        for (int i = 0; i <= left.length - 1; i++) {
            left[i] = array[i];
        }

        int[] right = new int[array.length - middle];
        for (int i = middle; i <= array.length - 1; i++) {
            right[i - middle] = array[i];
        }

        left = sort(left, depth+1);
        right = sort(right, depth+1);

        return merge(left, right);
    }
    else
    {  
        return array;
    }
}