/// <summary>
        /// Divide el problema de ordenación MergeSort en 2 problemas de ordenación MergeSort
        /// </summary>
        /// <param name="p">Problema</param>
        /// <returns>2 Problemas</returns>
        public override Problema[] Divide(Problema p)
        {
            MSProblema <T> m     = (MSProblema <T>)p;
            int            medio = (m.Ultimo + m.Primero) / 2;

            MSProblema <T>[] subp = new MSProblema <T> [2];
            subp[0] = new MSProblema <T>(m.Array, m.Primero, medio);
            subp[1] = new MSProblema <T>(m.Array, medio + 1, m.Ultimo);
            return(subp);
        }
        /// <summary>
        /// Resulución del Caso base del problema de ordenación MergeSort
        /// </summary>
        /// <param name="p">Problema</param>
        /// <returns>Solucion</returns>
        public override Solucion resuelveCasoBase(Problema p)
        {
            MSProblema <T> m = (MSProblema <T>)p;

            return(new MSSolucion <T>(m.Array, m.Primero, m.Ultimo));
        }
        /// <summary>
        /// Caso base del problema de ordenación MergeSort
        /// </summary>
        /// <param name="p">Problema</param>
        /// <returns></returns>
        public override bool esCasoBase(Problema p)
        {
            MSProblema <T> m = (MSProblema <T>)p;

            return(m.Ultimo == m.Primero);
        }