我的合并排序代码有什么问题,我想不出来?

时间:2016-12-06 14:36:17

标签: c++ sorting mergesort

我是编程新手。我刚刚开始研究算法。 我的代码应该只执行合并排序过程,但它有一些错误,虽然它正确构建。 我的代码接受输入然后停止工作。 它显示此错误:error

parallelism threshold

1 个答案:

答案 0 :(得分:0)

堆栈溢出错误是由无限递归“循环”引起的。

merge()需要另外两个参数。在这个例子中,我使用_alloca()从堆栈分配,因此不需要free。这仅适用于小到足以不溢出堆栈的数组。另一种方法是使用malloc()和free()。​​

    void merge(int a[], int lo, int hi)    // hi is end == last + 1
    {
        if((hi - lo) < 2)
            return;
        int mid = (lo+hi)/2;
        int *left  = _alloca((mid - lo)*sizeof(int));  // alloc from stack
        int *right = _alloca((hi - mid)*sizeof(int));  // alloc from stack
        for (int i = lo; i < mid; i++)
            left[i-lo] = a[i];
        for (int i = mid; i < hi; i++)
            right[i-mid] = a[i];
        merge(left, lo, mid);
        merge(right, mid, hi);
        sort(left, right, a, mid-lo, hi-mid);
        }
    }

sort()中的最后一个需要使用j代替i:

        while (j < R) {              // use j here
            a[k] = right[j];
            k++; j++;
        }

替代方法 - 使用一次辅助函数来执行与[]相同大小的第二个数组的一次性分配,或者将其称为b [],并将b []的相同索引用作[]在进行拆分和合并时。 b []将作为参数传递给merge()和sort(),并将用于代替left []和right []。

名称令人困惑,merge()实际上是“排序”,而sort()实际上是“合并”。