solo una nota rápida, esto no es tarea. Solo estoy tratando de repasar mis algoritmos. Estoy jugando con mergesort en C# y he escrito un método recursivo que puede clasificar en base a los genéricos:C# merge sort performance
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;
}
}
Esto funciona, pero es muy lento. He usado System.Diagnostic.StopWatch para verificar el rendimiento en comparación con Array.Sort (que usa el algoritmo QuickSort) para compararlo con mi MergeSort y la diferencia es tan significativa que me pregunto si tal vez estoy implementando esto incorrectamente. ¿Algún comentario?
¿Has leído el artículo de Jons? http://msmvps.com/blogs/jon_skeet/archive/2011/01/06/reimplementing-linq-to-objects-part-26c-optimizing-orderedenumerable.aspx –
¿Has probado la misma implementación pero sin genéricos? – pfries
Grandes respuestas chicos. Lamento que haya tardado tanto en responder, he estado reescribiendo el código y terminé con un código que se parece casi exactamente a lo que sugirió Rafe. Tremendamente más rápido, pero aún mucho más lento que el Array nativo.Sort. Todavía jugando con eso un poco. – hobeau