valores una posiciones matriz matrices llenar imprimir elementos ejercicios con comparar como arreglo java algorithm big-o mergesort

java - posiciones - ¿Cómo combinar dos matrices ordenadas en una matriz ordenada?



imprimir una matriz en java (30)

GallopSearch Merge: O (log (n) * log (i)) en lugar de O (n)

Seguí adelante e implementé la sugerencia de Barba Gris en los comentarios. Principalmente porque necesitaba una versión de misión crítica de este código altamente eficiente.

  • El código usa un gallopSearch que es O (log (i)) donde i es la distancia desde el índice actual que existe el índice relevante.
  • El código usa un binarySearch para después de que la búsqueda del galope ha identificado el rango apropiado. Como gallop limitó esto a un rango menor, la binarySearch resultante también es O (log (i))
  • El galope y la fusión se realizan hacia atrás. Esto no parece crítico para la misión, pero permite fusionar matrices. Si una de sus matrices tiene suficiente espacio para almacenar los valores de los resultados, puede simplemente usarla como la matriz de fusión y la matriz de resultados. Debe especificar el rango válido dentro de la matriz en tal caso.
  • No requiere asignación de memoria en ese caso (grandes ahorros en operaciones críticas). Simplemente se asegura de que no sobrescribe y no puede sobrescribir ningún valor no procesado (lo que solo se puede hacer al revés). De hecho, usa la misma matriz para las dos entradas y los resultados. No sufrirá efectos nocivos.
  • Siempre utilicé Integer.compare () por lo que podría cambiarse para otros fines.
  • Existe la posibilidad de que haya echado a perder un poco y no haya utilizado la información que he probado previamente. Como la búsqueda binaria en un rango de dos valores, para los cuales ya se verificó un valor. También podría haber una forma mejor de indicar el bucle principal, ya que el valor de volteo c no sería necesario si se combinaran en dos operaciones en secuencia. Ya sabes que harás uno y luego el otro cada vez. Hay espacio para algo de polaco.

Esta debería ser la forma más eficiente de hacerlo, con la complejidad temporal de O (log (n) * log (i)) en lugar de O (n). Y peor complejidad de tiempo de caso de O (n). Si sus matrices son agrupadas y tienen largas cadenas de valores juntas, esto empequeñecerá cualquier otra forma de hacerlo, de lo contrario, será mejor que ellas.

Tiene dos valores de lectura en los extremos de la matriz de fusión y el valor de escritura dentro de la matriz de resultados. Después de descubrir cuál es el valor final es menor, realiza una búsqueda al galope en esa matriz. 1, 2, 4, 8, 16, 32, etc. Cuando encuentra el rango donde el valor de lectura de la otra matriz es más grande. Búsquedas binarias en ese rango (corta el rango a la mitad, busca la mitad correcta, repite hasta el valor único). Luego, la matriz copia esos valores en la posición de escritura. Teniendo en cuenta que la copia, por necesidad, se mueve de tal manera que no puede sobreescribir los mismos valores de cualquiera de las matrices de lectura (lo que significa que la matriz de escritura y la matriz de lectura pueden ser las mismas). Luego realiza la misma operación para la otra matriz que ahora se sabe que es menor que el nuevo valor de lectura de la otra matriz.

static public int gallopSearch(int current, int[] array, int v) { int d = 1; int seek = current - d; int prevIteration = seek; while (seek > 0) { if (Integer.compare(array[seek], v) <= 0) { break; } prevIteration = seek; d <<= 1; seek = current - d; if (seek < 0) { seek = 0; } } if (prevIteration != seek) { seek = binarySearch(array, seek, prevIteration, v); seek = seek >= 0 ? seek : ~seek; } return seek; } static public int binarySearch(int[] list, int fromIndex, int toIndex, int v) { int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >>> 1; int midVal = list[mid]; int cmp = Integer.compare(midVal, v); if (cmp < 0) { low = mid + 1; } else if (cmp > 0) { high = mid - 1; } else { return mid;// key found } } return -(low + 1);// key not found. } static public int[] sortedArrayMerge(int[] a, int[] b) { return sortedArrayMerge(null, a, a.length, b, b.length); } static public int[] sortedArrayMerge(int[] results, int[] a, int aRead, int b[], int bRead) { int write = aRead + bRead, length, gallopPos; if ((results == null) || (results.length < write)) { results = new int[write]; } if (aRead > 0 && bRead > 0) { int c = Integer.compare(a[aRead - 1], b[bRead - 1]); while (aRead > 0 && bRead > 0) { switch (c) { default: gallopPos = gallopSearch(aRead, a, b[bRead-1]); length = (aRead - gallopPos); write -= length; aRead = gallopPos; System.arraycopy(a, gallopPos--, results, write, length); c = -1; break; case -1: gallopPos = gallopSearch(bRead, b, a[aRead-1]); length = (bRead - gallopPos); write -= length; bRead = gallopPos; System.arraycopy(b, gallopPos--, results, write, length); c = 1; break; } } } if (bRead > 0) { if (b != results) { System.arraycopy(b, 0, results, 0, bRead); } } else if (aRead > 0) { if (a != results) { System.arraycopy(a, 0, results, 0, aRead); } } return results; }

Esta debería ser la forma más eficiente de hacerlo.

Algunas respuestas tienen una habilidad de eliminación duplicada. Eso requerirá un algoritmo O (n) porque en realidad debe comparar cada elemento. Así que aquí hay un stand-alone para eso, para ser aplicado después del hecho. No puede galopar a través de múltiples entradas en todo el recorrido si necesita verlas todas, aunque podría galopar a través de los duplicados, si tuviera muchas.

static public int removeDuplicates(int[] list, int size) { int write = 1; for (int read = 1; read < size; read++) { if (list[read] == list[read - 1]) { continue; } list[write++] = list[read]; } return write; }

Actualización: respuesta anterior, código no horrible pero claramente inferior al anterior.

Otra hiper optimización innecesaria. No solo invoca arraycopy para los bits finales, sino también para el comienzo. Procesamiento de cualquier no introducción introductoria en O (log (n)) por un binarySearch en los datos. O (log (n) + n) es O (n) y, en algunos casos, el efecto será bastante pronunciado, especialmente cuando no hay ninguna superposición entre las matrices de fusión.

private static int binarySearch(int[] array, int low, int high, int v) { high = high - 1; while (low <= high) { int mid = (low + high) >>> 1; int midVal = array[mid]; if (midVal > v) low = mid + 1; else if (midVal < v) high = mid - 1; else return mid; // key found } return low;//traditionally, -(low + 1); // key not found. } private static int[] sortedArrayMerge(int a[], int b[]) { int result[] = new int[a.length + b.length]; int k, i = 0, j = 0; if (a[0] > b[0]) { k = i = binarySearch(b, 0, b.length, a[0]); System.arraycopy(b, 0, result, 0, i); } else { k = j = binarySearch(a, 0, a.length, b[0]); System.arraycopy(a, 0, result, 0, j); } while (i < a.length && j < b.length) { result[k++] = (a[i] < b[j]) ? a[i++] : b[j++]; } if (j < b.length) { System.arraycopy(b, j, result, k, (b.length - j)); } else { System.arraycopy(a, i, result, k, (a.length - i)); } return result; }

Esto se me preguntó en una entrevista y esta es la solución que proporcioné:

public static int[] merge(int[] a, int[] b) { int[] answer = new int[a.length + b.length]; int i = 0, j = 0, k = 0; while (i < a.length && j < b.length) { if (a[i] < b[j]) { answer[k] = a[i]; i++; } else { answer[k] = b[j]; j++; } k++; } while (i < a.length) { answer[k] = a[i]; i++; k++; } while (j < b.length) { answer[k] = b[j]; j++; k++; } return answer; }

¿Hay una manera más eficiente de hacer esto?

Editar: métodos de longitud corregidos.


Algoritmo podría mejorarse de muchas maneras. Por ejemplo, es razonable verificar, si a[m-1]<b[0] o b[n-1]<a[0] . En cualquiera de esos casos, no hay necesidad de hacer más comparaciones. Algoritmo podría simplemente copiar matrices de origen en el orden correcto.

Las mejoras más complicadas pueden incluir buscar partes entrelazadas y ejecutar el algoritmo de combinación solo para ellas. Podría ahorrar mucho tiempo, cuando los tamaños de las matrices combinadas difieren en las puntuaciones de los tiempos.


Aquí está la función actualizada. Elimina los duplicados, con suerte alguien lo encontrará utilizable:

public static long[] merge2SortedAndRemoveDublicates(long[] a, long[] b) { long[] answer = new long[a.length + b.length]; int i = 0, j = 0, k = 0; long tmp; while (i < a.length && j < b.length) { tmp = a[i] < b[j] ? a[i++] : b[j++]; for ( ; i < a.length && a[i] == tmp; i++); for ( ; j < b.length && b[j] == tmp; j++); answer[k++] = tmp; } while (i < a.length) { tmp = a[i++]; for ( ; i < a.length && a[i] == tmp; i++); answer[k++] = tmp; } while (j < b.length) { tmp = b[j++]; for ( ; j < b.length && b[j] == tmp; j++); answer[k++] = tmp; } return Arrays.copyOf(answer, k); }


Aquí está mi implementación java que elimina duplicados.

public static int[] mergesort(int[] a, int[] b) { int[] c = new int[a.length + b.length]; int i = 0, j = 0, k = 0, duplicateCount = 0; while (i < a.length || j < b.length) { if (i < a.length && j < b.length) { if (a[i] == b[j]) { c[k] = a[i]; i++;j++;duplicateCount++; } else { c[k] = a[i] < b[j] ? a[i++] : b[j++]; } } else if (i < a.length) { c[k] = a[i++]; } else if (j < a.length) { c[k] = b[j++]; } k++; } return Arrays.copyOf(c, c.length - duplicateCount); }


Aquí hay una forma abreviada escrita en javascript:

function sort( a1, a2 ) { var i = 0 , j = 0 , l1 = a1.length , l2 = a2.length , a = []; while( i < l1 && j < l2 ) { a1[i] < a2[j] ? (a.push(a1[i]), i++) : (a.push( a2[j]), j++); } i < l1 && ( a = a.concat( a1.splice(i) )); j < l2 && ( a = a.concat( a2.splice(j) )); return a; }


Creo que la introducción de la lista de omisiones para la matriz clasificada más grande puede reducir el número de comparaciones y puede acelerar el proceso de copia en la tercera matriz. Esto puede ser bueno si la matriz es demasiado grande.


Cualquier mejora que podría hacerse sería micro-optimizaciones, el algoritmo general es correcto.


Esta solución también es muy similar a otras publicaciones, excepto que usa System.arrayCopy para copiar los elementos restantes de la matriz.

private static int[] sortedArrayMerge(int a[], int b[]) { int result[] = new int[a.length +b.length]; int i =0; int j = 0;int k = 0; while(i<a.length && j <b.length) { if(a[i]<b[j]) { result[k++] = a[i]; i++; } else { result[k++] = b[j]; j++; } } System.arraycopy(a, i, result, k, (a.length -i)); System.arraycopy(b, j, result, k, (b.length -j)); return result; }


Este problema está relacionado con el algoritmo mergesort, en el cual dos sub-arrays ordenados se combinan en una única sub-matriz ordenada. El libro de CLRS da un ejemplo del algoritmo y elimina la necesidad de verificar si se ha llegado al final agregando un valor de centinela (algo que se compare y "mayor que cualquier otro valor") al final de cada conjunto.

Escribí esto en Python, pero también se debe traducir muy bien a Java:

def func(a, b): class sentinel(object): def __lt__(*_): return False ax, bx, c = a[:] + [sentinel()], b[:] + [sentinel()], [] i, j = 0, 0 for k in range(len(a) + len(b)): if ax[i] < bx[j]: c.append(ax[i]) i += 1 else: c.append(bx[j]) j += 1 return c


Las colecciones de Apache admiten el método de clasificación desde la versión 4; puedes hacer esto usando el método de collate en:

org.apache.commons.collections4.CollectionUtils

Aquí cita de javadoc:

collate(Iterable<? extends O> a, Iterable<? extends O> b, Comparator<? super O> c)

Fusiona dos colecciones ordenadas, b , en una única lista ordenada, de modo que se conserve el orden de los elementos de acuerdo con el Comparador c.

¡No reinventes la rueda! Referencia del documento: http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html


Me sorprende que nadie haya mencionado esta implementación mucho más genial, eficiente y compacta:

public static int[] merge(int[] a, int[] b) { int[] answer = new int[a.length + b.length]; int i = a.length - 1, j = b.length - 1, k = answer.length; while (k > 0) answer[--k] = (j < 0 || (i >= 0 && a[i] >= b[j])) ? a[i--] : b[j--]; return answer; }

Puntos de interés

  1. ¡Observe que realiza el mismo o menos número de operaciones que cualquier otro algoritmo de O (n) , pero en una instrucción literalmente única en un solo ciclo while!
  2. Si dos matrices tienen aproximadamente el mismo tamaño, la constante para O (n) es la misma. Sin embargo, si las matrices están realmente desequilibradas, las versiones con System.arraycopy ganarían porque internamente puede hacerlo con instrucciones de ensamblaje de x86 individuales.
  3. Observe a[i] >= b[j] lugar de a[i] > b[j] . Esto garantiza la "estabilidad" que se define como cuando los elementos de ayb son iguales, queremos elementos de a antes de b.

Mi lenguaje de programación favorito es JavaScript

function mergeSortedArrays(a, b){ var result = []; var sI = 0; var lI = 0; var smallArr; var largeArr; var temp; if(typeof b[0] === ''undefined'' || a[0]<b[0]){ smallArr = a; largeArr = b; } else{ smallArr = b; largeArr = a; } while(typeof smallArr[sI] !== ''undefined''){ result.push(smallArr[sI]); sI++; if(smallArr[sI]>largeArr[lI] || typeof smallArr[sI] === ''undefined''){ temp = smallArr; smallArr = largeArr; largeArr = temp; temp = sI; sI = lI; lI = temp; } } return result; }


Puede usar 2 hilos para completar el conjunto resultante, uno desde el frente y el otro desde atrás.

Esto puede funcionar sin ninguna sincronización en el caso de los números, por ejemplo, si cada hilo inserta la mitad de los valores.


Puede usar operadores ternarios para hacer que el código sea un poco más compacto

public static int[] mergeArrays(int[] a1, int[] a2) { int[] res = new int[a1.length + a2.length]; int i = 0, j = 0; while (i < a1.length && j < a2.length) { res[i + j] = a1[i] < a2[j] ? a1[i++] : a2[j++]; } while (i < a1.length) { res[i + j] = a1[i++]; } while (j < a2.length) { res[i + j] = a2[j++]; } return res; }


Se puede hacer en 4 declaraciones como a continuación

int a[] = {10, 20, 30}; int b[]= {9, 14, 11}; int res[]=new int[a.legth+b.length]; System.arraycopy(a,0, res, 0, a.length); System.arraycopy(b,0,res,a.length, b.length); Array.sort(res)


Tal vez use System.arraycopy

public static byte[] merge(byte[] first, byte[] second){ int len = first.length + second.length; byte[] full = new byte[len]; System.arraycopy(first, 0, full, 0, first.length); System.arraycopy(second, 0, full, first.length, second.length); return full; }


Tuve que escribirlo en javascript, aquí está:

function merge(a, b) { var result = []; var ai = 0; var bi = 0; while (true) { if ( ai < a.length && bi < b.length) { if (a[ai] < b[bi]) { result.push(a[ai]); ai++; } else if (a[ai] > b[bi]) { result.push(b[bi]); bi++; } else { result.push(a[ai]); result.push(b[bi]); ai++; bi++; } } else if (ai < a.length) { result.push.apply(result, a.slice(ai, a.length)); break; } else if (bi < b.length) { result.push.apply(result, b.slice(bi, b.length)); break; } else { break; } } return result; }


Una pequeña mejora, pero después del bucle principal, puede usar System.arraycopy para copiar la cola de cualquier matriz de entrada cuando llegue al final de la otra. Sin embargo, eso no cambiará las características de rendimiento O(n) de su solución.


Since the question doesn''t assume any specific language. Here is the solution in Python. Assuming the arrays are already sorted.

Approach 1 - using numpy arrays: import numpy

arr1 = numpy.asarray([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 14, 15, 55]) arr2 = numpy.asarray([11, 32, 43, 45, 66, 76, 88]) array = numpy.concatenate((arr1,arr2), axis=0) array.sort()

Approach 2 - Using list, assuming lists are sorted.

list_new = list1.extend(list2) list_new.sort()


To marge two sorted array in O(m+n) time complexity use below approach with one loop only. m and n is length of first array and second array.

public class MargeSortedArray { public static void main(String[] args) { int[] array = new int[]{1,3,4,7}; int[] array2 = new int[]{2,5,6,8,12,45}; int[] newarry = margeToSortedArray(array, array2); //newarray is marged array } // marge two sorted array with o(a+n) time complexity public static int[] margeToSortedArray(int[] array, int[] array2) { int newarrlen = array.length+array2.length; int[] newarr = new int[newarrlen]; int pos1=0,pos2=0; int len1=array.length, len2=array2.length; for(int i =0;i<newarrlen;i++) { if(pos1>=len1) { newarr[i]=array2[pos2]; pos2++; continue; } if(pos2>=len2) { newarr[i]=array[pos1]; pos1++; continue; } if(array[pos1]>array2[pos2]) { newarr[i]=array2[pos2]; pos2++; } else { newarr[i]=array[pos1]; pos1++; } } return newarr; } }


public class Merge { // stably merge a[lo .. mid] with a[mid+1 .. hi] using aux[lo .. hi] public static void merge(Comparable[] a, Comparable[] aux, int lo, int mid, int hi) { // precondition: a[lo .. mid] and a[mid+1 .. hi] are sorted subarrays assert isSorted(a, lo, mid); assert isSorted(a, mid+1, hi); // copy to aux[] for (int k = lo; k <= hi; k++) { aux[k] = a[k]; } // merge back to a[] int i = lo, j = mid+1; for (int k = lo; k <= hi; k++) { if (i > mid) a[k] = aux[j++]; else if (j > hi) a[k] = aux[i++]; else if (less(aux[j], aux[i])) a[k] = aux[j++]; else a[k] = aux[i++]; } // postcondition: a[lo .. hi] is sorted assert isSorted(a, lo, hi); } // mergesort a[lo..hi] using auxiliary array aux[lo..hi] private static void sort(Comparable[] a, Comparable[] aux, int lo, int hi) { if (hi <= lo) return; int mid = lo + (hi - lo) / 2; sort(a, aux, lo, mid); sort(a, aux, mid + 1, hi); merge(a, aux, lo, mid, hi); } public static void sort(Comparable[] a) { Comparable[] aux = new Comparable[a.length]; sort(a, aux, 0, a.length-1); assert isSorted(a); } /*********************************************************************** * Helper sorting functions ***********************************************************************/ // is v < w ? private static boolean less(Comparable v, Comparable w) { return (v.compareTo(w) < 0); } // exchange a[i] and a[j] private static void exch(Object[] a, int i, int j) { Object swap = a[i]; a[i] = a[j]; a[j] = swap; } /*********************************************************************** * Check if array is sorted - useful for debugging ***********************************************************************/ private static boolean isSorted(Comparable[] a) { return isSorted(a, 0, a.length - 1); } private static boolean isSorted(Comparable[] a, int lo, int hi) { for (int i = lo + 1; i <= hi; i++) if (less(a[i], a[i-1])) return false; return true; } /*********************************************************************** * Index mergesort ***********************************************************************/ // stably merge a[lo .. mid] with a[mid+1 .. hi] using aux[lo .. hi] private static void merge(Comparable[] a, int[] index, int[] aux, int lo, int mid, int hi) { // copy to aux[] for (int k = lo; k <= hi; k++) { aux[k] = index[k]; } // merge back to a[] int i = lo, j = mid+1; for (int k = lo; k <= hi; k++) { if (i > mid) index[k] = aux[j++]; else if (j > hi) index[k] = aux[i++]; else if (less(a[aux[j]], a[aux[i]])) index[k] = aux[j++]; else index[k] = aux[i++]; } } // return a permutation that gives the elements in a[] in ascending order // do not change the original array a[] public static int[] indexSort(Comparable[] a) { int N = a.length; int[] index = new int[N]; for (int i = 0; i < N; i++) index[i] = i; int[] aux = new int[N]; sort(a, index, aux, 0, N-1); return index; } // mergesort a[lo..hi] using auxiliary array aux[lo..hi] private static void sort(Comparable[] a, int[] index, int[] aux, int lo, int hi) { if (hi <= lo) return; int mid = lo + (hi - lo) / 2; sort(a, index, aux, lo, mid); sort(a, index, aux, mid + 1, hi); merge(a, index, aux, lo, mid, hi); } // print array to standard output private static void show(Comparable[] a) { for (int i = 0; i < a.length; i++) { StdOut.println(a[i]); } } // Read strings from standard input, sort them, and print. public static void main(String[] args) { String[] a = StdIn.readStrings(); Merge.sort(a); show(a); } }


//How to merge two sorted arrays into a sorted array without duplicates? //simple C Coding #include <stdio.h> #include <stdlib.h> #include <string.h> main() { int InputArray1[] ={1,4,5,7,8,9,12,13,14,17,40}; int InputArray2[] ={4,5,11,14,15,17,18,19,112,122,122,122,122}; int n=10; int OutputArray[30]; int i=0,j=0,k=0; //k=OutputArray while(i<11 && j<13) { if(InputArray1[i]<InputArray2[j]) { if (k == 0 || InputArray1[i]!= OutputArray[k-1]) { OutputArray[k++] = InputArray1[i]; } i=i+1; } else if(InputArray1[i]>InputArray2[j]) { if (k == 0 || InputArray2[j]!= OutputArray[k-1]) { OutputArray[k++] = InputArray2[j]; } j=j+1; } else { if (k == 0 || InputArray1[i]!= OutputArray[k-1]) { OutputArray[k++] = InputArray1[i]; } i=i+1; j=j+1; } }; while(i<11) { if(InputArray1[i]!= OutputArray[k-1]) OutputArray[k++] = InputArray1[i++]; else i++; } while(j<13) { if(InputArray2[j]!= OutputArray[k-1]) OutputArray[k++] = InputArray2[j++]; else j++; } for(i=0; i<k; i++) { printf("sorted data:%d/n",OutputArray[i]); }; }


import java.util.Arrays; public class MergeTwoArrays { static int[] arr1=new int[]{1,3,4,5,7,7,9,11,13,15,17,19}; static int[] arr2=new int[]{2,4,6,8,10,12,14,14,16,18,20,22}; public static void main(String[] args){ int FirstArrayLocation =0 ; int SecondArrayLocation=0; int[] mergeArr=new int[arr1.length + arr2.length]; for ( int i=0; i<= arr1.length + arr2.length; i++){ if (( FirstArrayLocation < arr1.length ) && (SecondArrayLocation < arr2.length)){ if ( arr1[FirstArrayLocation] <= arr2[SecondArrayLocation]){ mergeArr[i]=arr1[FirstArrayLocation]; FirstArrayLocation++; }else{ mergeArr[i]=arr2[SecondArrayLocation]; SecondArrayLocation++; } } else if(SecondArrayLocation < arr2.length){ mergeArr[i]=arr2[SecondArrayLocation]; SecondArrayLocation++; }else if ( FirstArrayLocation < arr1.length ){ mergeArr[i]=arr1[FirstArrayLocation]; FirstArrayLocation++; } } } }


public int[] merge(int[] a, int[] b) { int[] result = new int[a.length + b.length]; int aIndex, bIndex = 0; for (int i = 0; i < result.length; i++) { if (aIndex < a.length && bIndex < b.length) { if (a[aIndex] < b[bIndex]) { result[i] = a[aIndex]; aIndex++; } else { result[i] = b[bIndex]; bIndex++; } } else if (aIndex < a.length) { result[i] = a[aIndex]; aIndex++; } else { result[i] = b[bIndex]; bIndex++; } } return result; }


public static int[] merge(int[] a, int[] b) { int[] answer = new int[a.length + b.length]; int i = 0, j = 0, k = 0; while (i < a.length && j < b.length) answer[k++] = a[i] < b[j] ? a[i++] : b[j++]; while (i < a.length) answer[k++] = a[i++]; while (j < b.length) answer[k++] = b[j++]; return answer; }

Es un poco más compacto pero exactamente igual.


public static int[] merge(int[] a, int[] b) { int[] mergedArray = new int[(a.length + b.length)]; int i = 0, j = 0; int mergedArrayIndex = 0; for (; i < a.length || j < b.length;) { if (i < a.length && j < b.length) { if (a[i] < b[j]) { mergedArray[mergedArrayIndex] = a[i]; i++; } else { mergedArray[mergedArrayIndex] = b[j]; j++; } } else if (i < a.length) { mergedArray[mergedArrayIndex] = a[i]; i++; } else if (j < b.length) { mergedArray[mergedArrayIndex] = b[j]; j++; } mergedArrayIndex++; } return mergedArray; }


public static int[] merge(int[] listA, int[] listB) { int[] mergedList = new int[ listA.length + listB.length]; int i = 0; // Counter for listA int j = 0; // Counter for listB int k = 0; // Counter for mergedList while (true) { if (i >= listA.length && j >= listB.length) { break; } if (i < listA.length && j < listB.length) { // If both counters are valid. if (listA[i] <= listB[j]) { mergedList[k] = listA[i]; k++; i++; } else { mergedList[k] = listB[j]; k++; j++; } } else if (i < listA.length && j >= listB.length) { // If only A''s counter is valid. mergedList[k] = listA[i]; k++; i++; } else if (i <= listA.length && j < listB.length) { // If only B''s counter is valid mergedList[k] = listB[j]; k++; j++; } } return mergedList; }


public static int[] mergeSorted(int[] left, int[] right) { System.out.println("merging " + Arrays.toString(left) + " and " + Arrays.toString(right)); int[] merged = new int[left.length + right.length]; int nextIndexLeft = 0; int nextIndexRight = 0; for (int i = 0; i < merged.length; i++) { if (nextIndexLeft >= left.length) { System.arraycopy(right, nextIndexRight, merged, i, right.length - nextIndexRight); break; } if (nextIndexRight >= right.length) { System.arraycopy(left, nextIndexLeft, merged, i, left.length - nextIndexLeft); break; } if (left[nextIndexLeft] <= right[nextIndexRight]) { merged[i] = left[nextIndexLeft]; nextIndexLeft++; continue; } if (left[nextIndexLeft] > right[nextIndexRight]) { merged[i] = right[nextIndexRight]; nextIndexRight++; continue; } } System.out.println("merged : " + Arrays.toString(merged)); return merged; }

Just a small different from the original solution


public static void main(String[] args) { int[] arr1 = {2,4,6,8,10,999}; int[] arr2 = {1,3,5,9,100,1001}; int[] arr3 = new int[arr1.length + arr2.length]; int temp = 0; for (int i = 0; i < (arr3.length); i++) { if(temp == arr2.length){ arr3[i] = arr1[i-temp]; } else if (((i-temp)<(arr1.length)) && (arr1[i-temp] < arr2[temp])){ arr3[i] = arr1[i-temp]; } else{ arr3[i] = arr2[temp]; temp++; } } for (int i : arr3) { System.out.print(i + ", "); } }

La salida es:

1, 2, 3, 4, 5, 6, 8, 9, 10, 100, 999, 1001,


var arrCombo = function(arr1, arr2){ return arr1.concat(arr2).sort(function(x, y) { return x - y; }); };