/// <summary>
        /// Unifica dos souciones al de ordenación MergeSort
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public override Solucion Combina(Solucion[] s)
        {
            MSSolucion <T> sol1 = (MSSolucion <T>)s[0], sol2 = (MSSolucion <T>)s[1];
            int            s1 = sol1.Primero, s2 = sol2.Primero;
            int            pos = 0, n = (sol1.Ultimo - s1) + (sol2.Ultimo - s2) + 2;

            T[] array = new T[n];
            while (s1 <= sol1.Ultimo && s2 <= sol2.Ultimo)
            {
                T   obj1 = sol1.Array[s1], obj2 = sol2.Array[s2];
                int cmp = ((IComparable)obj1).CompareTo(obj2);
                if (cmp <= 0)
                {
                    array[pos] = obj1;
                    s1++;
                }
                else
                {
                    array[pos] = obj2;
                    s2++;
                }
                pos++;
            }
            //terminar de rellenar lo que queda
            while (s1 <= sol1.Ultimo)
            {
                array[pos] = sol1.Array[s1];
                pos++;
                s1++;
            }
            while (s2 <= sol2.Ultimo)
            {
                array[pos] = sol2.Array[s2];
                pos++;
                s2++;
            }
            MSSolucion <T> sol = new MSSolucion <T>(sol1.Array, sol1.Primero, sol2.Ultimo);

            for (int i = 0; i < array.Length; i++)
            {
                sol.Array[sol.Primero + i] = array[i];
            }
            return(sol);
        }
 /// <summary>
 /// Ordena un array de objetos IComparable desde la posición i a la posición j
 /// </summary>
 /// <param name="obj">array de objetos</param>
 /// <param name="i">primero</param>
 /// <param name="j">último</param>
 public void Ordenar(T[] obj, int i, int j)
 {
     MSSolucion <T> s = (MSSolucion <T>)DyV(new MSProblema <T>(obj, i, j));
 }