我是编程新手。我刚刚开始研究算法。 我的代码应该只执行合并排序过程,但它有一些错误,虽然它正确构建。 我的代码接受输入然后停止工作。 它显示此错误:
parallelism threshold
答案 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()实际上是“合并”。