如果你运行下面的Java代码,你可以看到分配的空间。当然,这不包括函数调用栈空间。
import java.util.Arrays;
public class MergeSort {
public static int[] sort(int[] nums) {
System.out.println("Input array = " + Arrays.toString(nums));
if (nums == null) return null;
int n = nums.length;
if (n == 0) return new int[] {};
int[] space = new int[1];
int[] result = sort(nums, 0 , n-1, space);
System.out.println("Output array = " + Arrays.toString(result));
return result;
}
private static int[] sort(int[] nums, int left, int right, int[] space) {
if (left == right) {
space[0]++;
System.out.println("Allocating a single entry. space = " + space[0]);
return new int[] {nums[left]};
}
int mid = (left + right)/2;
int[] sortedLeft = sort(nums, left, mid, space);
int[] sortedRight = sort(nums, mid + 1, right, space);
int[] merged = merge(sortedLeft, sortedRight, space);
space[0] = space[0]-sortedLeft.length - sortedRight.length;
System.out.println("Relinquishing left and right subarrays. Space = " + space[0]);
return merged;
}
private static int[] merge(int[] arr1, int[] arr2, int[] space) {
int n = arr1.length;
int m = arr2.length;
int[] arr = new int[m+n];
space[0] = space[0]+m+n;
System.out.println("Allocating merged array. Space = " + space[0]);
int i = 0, j = 0, k = 0;
for (; i < n && j < m; k++) {
arr[k] = arr1[i] <= arr2[j] ? arr1[i++] : arr2[j++];
}
while (i < n) {
arr[k++] = arr1[i++];
}
while (j < m) {
arr[k++] = arr2[j++];
}
return arr;
}
}
在一个8号尺寸的输入上,
public class App {
public static void main(String[] args) throws Exception {
MergeSort.sort(new int[] {1, 6, 3, 8, 1, 8, -2, 4});
}
}
你应该看到最大空间为16。
Input array = [1, 6, 3, 8, 1, 8, -2, 4]
Allocating a single entry. space = 1
Allocating a single entry. space = 2
Allocating merged array. Space = 4
Relinquishing left and right subarrays. Space = 2
Allocating a single entry. space = 3
Allocating a single entry. space = 4
Allocating merged array. Space = 6
Relinquishing left and right subarrays. Space = 4
Allocating merged array. Space = 8
Relinquishing left and right subarrays. Space = 4
Allocating a single entry. space = 5
Allocating a single entry. space = 6
Allocating merged array. Space = 8
Relinquishing left and right subarrays. Space = 6
Allocating a single entry. space = 7
Allocating a single entry. space = 8
Allocating merged array. Space = 10
Relinquishing left and right subarrays. Space = 8
Allocating merged array. Space = 12
Relinquishing left and right subarrays. Space = 8
Allocating merged array. Space = 16
Relinquishing left and right subarrays. Space = 8
Output array = [-2, 1, 1, 3, 4, 6, 8, 8]