我有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>
答案 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;
}
}