【发布时间】:2017-11-22 04:36:20
【问题描述】:
由于 .NET 要求所有变量在使用之前必须先实例化,我完全被合并排序的递归实现所困扰。我的教授希望我们使用递归算法将 MergeSort 的 C 代码翻译成 C#。这是C代码:
void doMergeSort(contact **head)
{
// do not process empty or single-node list
if (head==NULL || *head == NULL || (*head)->next==NULL)
return;
contact *first, *second;
// split the list in half
splitList(*head, &first, &second);
// perform recursive merge sort on both halves
doMergeSort(&first);
doMergeSort(&second);
// Merge both halves back together,
mergeList(first, second)
}
这是我的实现:
public static void DoMergeSort(ref LinkNode<T> head)
{
if (head == null || head.Next == null)
return;
LinkNode<T> first = null, second = null;
SplitList(head, ref first, ref second);
DoMergeSort(ref first);
DoMergeSort(ref second);
head = MergeLists(first, second);
}
现在,由于 C#/.NET 的规则,我不能省略第一个和第二个实例化,但是在函数中将它们声明为 null 会破坏它的递归性质。我已经被这个问题困扰了好几天了,我的教授也帮不上什么忙。尝试将其转换为迭代函数会更好吗,还是有一种方法可以递归完成?
我对采用迭代方法的唯一担心是它会“破坏”分配的规则。
【问题讨论】:
-
如果这是一个编程练习,请继续……否则只需使用众多内置函数之一进行排序。即 List.Sort 或 linq OrderBy
-
另外,我建议在处理不确定的递归深度时不要使用递归算法。根据深度,您可以轻松地用完堆栈。 .NET 应用程序中的默认堆栈大小仅为 1MB。例如,如果每次递归占用 100 个字节,则最大可能的迭代次数将是
-
我不知道你的问题是什么,但你的诊断不可能是正确的。为变量即将被覆盖赋予初始值不可能“搞砸递归性质”,无论这意味着什么。还有其他问题,无论是什么问题,都存在于您忽略向我们展示的代码中。
-
"现在,由于 C#/.NET 的规则,我不能省略实例化第一个和第二个":如果您不想在通过
ref传递变量之前初始化变量,请使用out关键字而不是ref关键字。