Programming
T04-1D-A09. Fusión ordenada de arrays
Enunciado
Haz un programa en Java que fusione en un solo array, dos arrays de números enteros que se encuentren ordenados de forma creciente, de tal manera que el array resultante de la fusión también se encuentre ordenado crecientemente.
Ejemplo:
- Dados los 2 arrays ordenados de enteros {10, 20, 30, 40, 50, 60} y {25, 38, 90}, el array resultante de la fusión sería así: {10, 20, 25, 30, 38, 40, 50, 60, 90}.
- Dados los 2 arrays ordenados de enteros {15, 22, 38, 38, 50, 70} y {22, 29, 38, 66}, el array resultante de la fusión sería así: {15, 22, 22, 29, 38, 38, 38, 50, 66, 70}
ENTRADA
La entrada comienza con un número indicando cuántos casos de prueba habrá que procesar.
Cada uno de los casos estará formado por:
- Una primera línea con el número N de elementos del array 1, donde N > 0
- Una segunda con los L elementos de dicho array separados por un espacio.
- Una tercera línea con el número M de elementos del array 2, donde M > 0
- Una segunda con los M elementos de dicho array separados por un espacio.
SALIDA
Por cada caso de prueba, el programa imprimirá por pantalla el array resultado de realizar la fusión ordenada de ambos arrays de entrada.
RESTRICCIONES
Se resolverá el problema haciendo uso de la siguiente descomposición funcional:
- Una función que reciba dos arrays de enteros ordenados crecientemente ambos y realice una fusión ordenada de los mismos.
El programa principal, para cada caso, recogerá de teclado los datos de cada array y, posteriomente, imprimirá el array resultado de hacer la fusión ordenada de los mismos.
Solución
import java.util.Scanner;
public class FusionOrdenada {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int numCasos = 0;
int arraySize1;
int[] array1;
int arraySize2;
int[] array2;
int[] array3;
numCasos = sc.nextInt();
for (int i = 1; i <= numCasos; i++) {
arraySize1 = sc.nextInt();
array1 = new int[arraySize1];
for (int j = 0; j < array1.length; j++) {
array1[j] = sc.nextInt();
}
arraySize2 = sc.nextInt();
array2 = new int[arraySize2];
for (int j = 0; j < array2.length; j++) {
array2[j] = sc.nextInt();
}
array3 = fusionOrdenada(array1, array2);
for (int j = 0; j < array3.length; j++) {
System.out.print(array3[j] + " ");
}
System.out.println();
}
}
public static int[] fusionOrdenada(int[] array1, int[] array2) {
int[] nuevoArray;
int sizeNuevoArray = array1.length + array2.length;
nuevoArray = new int[sizeNuevoArray];
int posArray1 = 0;
int posArray2 = 0;
int posNuevoArray = 0;
while (posArray1 < array1.length && posArray2 < array2.length) {
if (array1[posArray1] <= array2[posArray2]) {
nuevoArray[posNuevoArray] = array1[posArray1];
posArray1++;
} else {
nuevoArray[posNuevoArray] = array2[posArray2];
posArray2++;
}
posNuevoArray++;
}
while (posArray1 < array1.length) {
nuevoArray[posNuevoArray] = array1[posArray1];
posArray1++;
posNuevoArray++;
}
while (posArray2 < array2.length) {
nuevoArray[posNuevoArray] = array2[posArray2];
posArray2++;
posNuevoArray++;
}
return nuevoArray;
}
}
Input
5 6 10 20 30 40 50 60 3 25 38 90 4 22 29 38 66 6 15 22 38 38 50 70 7 3 5 8 10 20 20 40 4 5 10 20 25 1 54 10 100 130 160 190 200 230 390 400 401 404 7 20 30 40 50 60 70 80 1 80
5 6 10 20 30 40 50 60 3 25 38 90 4 22 29 38 66 6 15 22 38 38 50 70 7 3 5 8 10 20 20 40 4 5 10 20 25 1 54 10 100 130 160 190 200 230 390 400 401 404 7 20 30 40 50 60 70 80 1 80
Output
10 20 25 30 38 40 50 60 90 15 22 22 29 38 38 38 50 66 70 3 5 5 8 10 10 20 20 20 25 40 54 100 130 160 190 200 230 390 400 401 404 20 30 40 50 60 70 80 80
10 20 25 30 38 40 50 60 90 15 22 22 29 38 38 38 50 66 70 3 5 5 8 10 10 20 20 20 25 40 54 100 130 160 190 200 230 390 400 401 404 20 30 40 50 60 70 80 80

