【发布时间】:2013-05-23 17:53:37
【问题描述】:
作为进入合并排序的第一次尝试,我生成了以下代码,它适用于字符串,因为它们比列表更容易处理。
class Program
{
static int iterations = 0;
static void Main(string[] args)
{
string test = "zvutsrqponmlihgfedcba";
test = MergeSort(test);
// test is sorted after 41 iterations
}
static string MergeSort(string input)
{
iterations++;
if (input.Length < 2)
return input;
int pivot = 0;
foreach (char c in input)
pivot += c;
pivot /= input.Length;
string left = "";
string right = "";
foreach (char c in input)
if (c <= (char)pivot)
left += c;
else
right += c;
return string.Concat(new string[] { MergeSort(left), MergeSort(right) });
}
}
在 Wikipedia 上阅读可能的优化时,我发现以下提示“为了确保最多使用 O(log N) 空间,首先递归到数组的较小一半,然后使用尾调用递归到另一个。 "但老实说,我不知道如何将其应用于我的案例。 当我们学习递归和阶乘时,我对 IT 课上的尾调用有一些模糊的记忆,但我真的不明白如何将 Wikipedia 的建议应用于我的代码。
任何帮助将不胜感激。
【问题讨论】:
-
@RobertHarvey Dangit,我正要发帖。
-
@RobertHarvey:嗯,这很复杂; x64 抖动在某些情况下会产生尾调用,即使 C# 编译器从不产生尾调用指令,但这不是其中之一。但是这个问题是关于“手动”将程序重写为尾递归的。
-
哦,好的,谢谢您的回答,我不知道。我想我应该在问之前告诉自己,但维基百科让我感到恐慌。还要感谢@torrential coding 将我的问题编辑为更合适的格式。
-
这不是归并排序;这是快速排序。
标签: c# mergesort tail-recursion