hob*_*eau 9 c# sorting algorithm mergesort
只是一个简单的说明,这不是功课.我只是想弄清楚我的算法.我在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;
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,但速度很慢.我已经使用System.Diagnostic.StopWatch来检查Array.Sort(它使用QuickSort算法)的性能来与我的MergeSort进行比较,差异是如此显着我想知道我是否实现了这个错误.任何意见?
tem*_*def 12
我不是C#程序员,但问题可能是使用像这样的语句吗?
left = left.Skip(1).ToArray();
Run Code Online (Sandbox Code Playgroud)
这可能以强制底层数组的深层副本的方式实现.如果是这样,这会将合并的性能从O(n)降低到O(n 2),立即将生成的合并排序的性能从O(n log n)降低到O(n 2).
(这是因为重复发生变化
T(1)= O(1)
T(n)≤2T(n/2)+ O(n)
其解决方案T(n)= O(n log n),to
T(1)= O(1)
T(n)≤2T(n/2)+ O(n 2)
其解决方案T(n)= O(n 2).)