tylko krótka notatka, to nie jest praca domowa. Próbuję odświeżyć moje algorytmy. Mam zabawy z mergesort w C# i pisałem rekurencyjnej metody, które można sortować w oparciu o rodzajowych:C# sortować wydajność sortowania
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;
}
}
To działa, ale to jest strasznie powolna. Użyłem System.Diagnostic.StopWatch do sprawdzenia wydajności w stosunku do Array.Sort (który używa algorytmu QuickSort) do porównania z moim MergeSort i różnica jest tak znacząca Zastanawiam się, czy może wprowadzam to źle. Wszelkie komentarze?
Czy czytasz artykuł Jons? http://msmvps.com/blogs/jon_skeet/archive/2011/01/06/reimplementing-linq-to-objects-part-26c-optimizing-orderedenumerable.aspx –
Czy wypróbowałeś tę samą implementację, ale bez generycznych? – pfries
Świetne odpowiedzi chłopaki. Przepraszam, że trwało tak długo, aby odpowiedzieć, przepisałem kod i skończyło się na kodzie, który wygląda prawie dokładnie tak, jak sugerował Rafe. Ogromnie szybszy, ale wciąż znacznie wolniejszy niż rodzimy Array.Sort. Wciąż z tym grałem. – hobeau