这是原始代码:
void mergeSort(int a[], int l, int r) {
if (r <= l) return;
int m = (r + l) / 2;
mergeSort(a, l, m);
mergeSort(a, m + 1, r);
merge(a, l, m, r);
}
void merge(int a[], int l, int m, int r) {
int i, j;
static int aux[maxN];
for (i = m + 1; i > l; i--) aux[i - 1] = a[i - 1];
for (j = m; j < r; j++) aux[r + m - j] = a[j + 1];
for (int k = l; k <= r; k++) {
// INCREMENT COUNTER AT THIS STEP
if (aux[j] < aux[i]) a[k] = aux[j--];
else a[k] = aux[i++];
}
}
我需要计算在此代码中进行的变量比较的数量。我已经评论了需要完成的大写(在合并函数中)。这是一个技巧问题,我们不允许使用任何全局变量作为计数器。我们只能修改函数的返回类型和参数。
基本上,我们需要在merge函数内增加一个计数器,mergeSort方法需要返回一个int(计数器值)而不是void。我该怎么办?
答案 0 :(得分:3)
int mergeSort(int a[], int l, int r) {
if (r <= l) return 0;
int cnt = 0;
...
cnt += mergeSort(a, l, m);
cnt += mergeSort(a, m + 1, r);
cnt += merge(a, l, m, r);
return cnt;
}
int merge(int a[], int l, int m, int r) {
int cnt = 0;
...
for (int k = l; k <= r; k++) {
// INCREMENT COUNTER AT THIS STEP
// increment cnt here
}
return cnt;
}
答案 1 :(得分:0)
提示您现在有两个功能:
void mergeSort(int a[], int l, int r);
void merge(int a[], int l, int m, int r);
^^^^
现在,您可能希望另外只是排序a
(逻辑上为void
)而不是...返回...比较次数。你需要做什么才能归还?