/// <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)); }