作为进入合并排序的第一次尝试,我生成了以下适用于字符串的代码,因为它们比列表更容易处理。
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 课的尾调用有一些模糊的记忆,但我真的不明白如何将维基百科的建议应用于我的一段代码。
任何帮助将非常感激。