【发布时间】:2014-03-08 23:56:50
【问题描述】:
我创建了一个合并排序,它使用额外的空间非常低效。每次递归调用都会创建一个新数组。在不影响函数参数的情况下,我可以创建一个只需要创建和删除一次的动态数组吗?
void mergesort_normal(Item *A, int p, int r)
{
int middle;
if (p < r) {
middle = p + (r - p) / 2;
mergesort_normal(A, p, middle);
mergesort_normal(A, middle +1, r);
merge_normal(A, p, middle, r);
}
}
void merge_normal (Item *A, int p, int mid, int r)
{
Item *helper = new Item[r+1];
int h = p;
int i = p;
int j = mid +1;
int k = 0;
while((h<=mid)&&(j<=r))
{
if(lessThan(A[h], A[j]))
{
helper[i]=key(A[h]);
h++;
}
else
{
helper[i]=key(A[j]);
j++;
}
i++;
}
if(h>mid)
{
for(k=j;k<=r;k++)
{
helper[i]=key(A[k]);
i++;
}
}
else
{
for(k=h;k<=mid;k++)
{
helper[i]=key(A[k]);
i++;
}
}
for(k=p;k<=r;k++)
A[k]=key(helper[k]);
}
【问题讨论】:
-
这段代码很难理解——它没有 cmets,而且几乎每个变量都只有一个字母的长度。此外,缩进关闭,代码似乎没有关闭括号。您的问题的答案是“可能”,但如果您的算法过于模糊和不完整而无法理解,我们将无法为您提供帮助!
-
您错过了合并床的删除。合并完成并且您已复制回原始序列后,对临时存储的需求也是如此。我不认为您至少可以为此使用
std::vector<>? (很明显你不能使用std::merge或std::inplace_merge如果这是用于学术界)。而且我还没有审查实际的算法,所以如果它错了,那本身就是另一个问题。 -
哦对了,代码末尾应该有一个删除。是的,这是给学校的,所以我不能只使用 std::vector 或 std::merge。该算法运行良好,可以完美地对数组进行排序。
-
啊。太糟糕了。 Sok,但仅供参考,您也不需要两个分区索引。您的 mergesort_normal 函数可以只接受两个参数,一个基地址和一个长度。指针算法可以进行分区。想一想。
-
我不允许更改函数的参数
标签: c++ algorithm sorting merge