如何将mergesort的返回类型更改为int?

时间:2015-04-17 16:28:29

标签: c++

这是原始代码:

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。我该怎么办?

2 个答案:

答案 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)而不是...返回...比较次数。你需要做什么才能归还?