【发布时间】:2012-08-22 08:07:19
【问题描述】:
只是一个简短的说明,这不是家庭作业。我只是想重温我的算法。我正在使用 C# 中的 MergeSort 并编写了一个可以基于泛型进行排序的递归方法:
class SortAlgorithms
{
public T[] MergeSort<T> (T[] unsortedArray) where T : System.IComparable<T>
{
T[] left, right;
int middle = unsortedArray.Length / 2;
left = new T[middle];
right = new T[unsortedArray.Length - middle];
if (unsortedArray.Length <= 1)
return unsortedArray;
for (int i = 0; i < middle; i++)
{
left[i] = unsortedArray[i];
}
for (int i = middle; i < unsortedArray.Length; i++)
{
right[i - middle] = unsortedArray[i];
}
left = MergeSort(left);
right = MergeSort(right);
return Merge<T>(left, right);
}
private T[] Merge<T> (T[] left, T[] right) where T : System.IComparable<T>
{
T[] result = new T[left.Length + right.Length];
int currentElement = 0;
while (left.Length > 0 || right.Length > 0)
{
if (left.Length > 0 && right.Length > 0)
{
if (left[0].CompareTo(right[0]) < 0)
{
result[currentElement] = left[0];
left = left.Skip(1).ToArray();
currentElement++;
}
else
{
result[currentElement] = right[0];
right = right.Skip(1).ToArray();
currentElement++;
}
}
else if (left.Length > 0)
{
result[currentElement] = left[0];
left = left.Skip(1).ToArray();
currentElement++;
}
else if (right.Length > 0)
{
result[currentElement] = right[0];
right = right.Skip(1).ToArray();
currentElement++;
}
}
return result;
}
}
这可行,但速度非常慢。我已经使用 System.Diagnostic.StopWatch 来检查 Array.Sort (使用 QuickSort 算法)的性能,以与我的 MergeSort 进行比较,差异如此之大,我想知道我是否实施了这个错误。有cmets吗?
【问题讨论】:
-
你读过 Jons 的文章吗? msmvps.com/blogs/jon_skeet/archive/2011/01/06/…
-
您是否尝试过相同的实现但没有泛型?
-
很好的答案伙计们。抱歉花了这么长时间才回复,我一直在重写代码,最终得到的代码看起来几乎与 Rafe 建议的完全一样。比原生 Array.Sort 快得多,但仍然慢得多。还是玩了一下。
标签: c# algorithm sorting mergesort