Sortierleistung bei C # -Merge
Nur eine kurze Notiz, das sind keine Hausaufgaben. Ich versuche nur, meine Algorithmen aufzufrischen. Ich spiele mit MergeSort in C # herum und habe eine rekursive Methode geschrieben, die nach Generika sortieren kann:
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;
}
}
Das funktioniert, ist aber schmerzhaft langsam. Ich habe System.Diagnostic.StopWatch verwendet, um die Leistung mit Array.Sort (das den QuickSort-Algorithmus verwendet) zu vergleichen, und der Unterschied ist so bedeutend, dass ich mich frage, ob ich das möglicherweise falsch implementiere. Irgendwelche Kommentare?