So führen Sie zwei sortierte Arrays in Java zusammen

1. Einleitung

In diesem Tutorial erfahren Sie, wie Sie zwei sortierte Arrays zu einem einzigen sortierten Array zusammenführen.

2. Problem

Lassen Sie uns das Problem verstehen. Wir haben zwei sortierte Arrays und möchten sie zu einem zusammenführen.

3. Algorithmus

Wenn wir das Problem analysieren , können wir leicht feststellen, dass wir dieses Problem mithilfe der Zusammenführungsoperation von Zusammenführungssortierung lösen können.

Angenommen , wir haben zwei sortierte Arrays foo und bar der Länge fooLength bzw. barLength . Als nächstes können wir ein anderes Array deklarieren, das aus der Größe fooLength + barLength zusammengeführt wurde .

Wir sollten dann beide Arrays in derselben Schleife durchlaufen. Wir behalten jeweils einen aktuellen Indexwert für fooPosition und barPosition bei . Bei einer bestimmten Iteration unserer Schleife nehmen wir das Array, dessen Index das Element mit dem kleineren Wert enthält, und erweitern diesen Index. Dieses Element nimmt die nächste Position im zusammengeführten Array ein.

Sobald wir alle Elemente von einem Array übertragen haben, kopieren wir die verbleibenden Elemente vom anderen in das zusammengeführte Array.

Lassen Sie uns nun den Vorgang in Bildern sehen, um den Algorithmus besser zu verstehen.

Schritt 1:

Wir vergleichen zunächst die Elemente in beiden Arrays und wählen das kleinere aus.

Dann erhöhen wir die Position im ersten Array.

Schritt 2:

Hier erhöhen wir die Position im zweiten Array und fahren mit dem nächsten Element fort, das 8 ist.

Schritt 3:

Am Ende dieser Iteration haben wir alle Elemente des ersten Arrays durchlaufen .

Schritt 4:

In diesem Schritt kopieren wir einfach alle verbleibenden Elemente aus dem zweiten Array, um das Ergebnis zu erhalten .

4. Implementierung

Nun wollen wir sehen, wie es implementiert wird:

public static int[] merge(int[] foo, int[] bar) { int fooLength = foo.length; int barLength = bar.length; int[] merged = new int[fooLength + barLength]; int fooPosition, barPosition, mergedPosition; fooPosition = barPosition = mergedPosition = 0; while(fooPosition < fooLength && barPosition < barLength) { if (foo[fooPosition] < bar[barPosition]) { merged[mergedPosition++] = foo[fooPosition++]; } else { merged[mergedPosition++] = bar[barPosition++]; } } while (fooPosition < fooLength) { merged[mergedPosition++] = foo[fooPosition++]; } while (barPosition < barLength) { merged[mergedPosition++] = bar[barPosition++]; } return merged; }

Und lassen Sie uns mit einem kurzen Test fortfahren:

@Test public void givenTwoSortedArrays_whenMerged_thenReturnMergedSortedArray() { int[] foo = { 3, 7 }; int[] bar = { 4, 8, 11 }; int[] merged = { 3, 4, 7, 8, 11 }; assertArrayEquals(merged, SortedArrays.merge(foo, bar)); }

5. Komplexität

Wir durchlaufen beide Arrays und wählen das kleinere Element. Am Ende kopieren wir den Rest der Elemente aus den foo oder bar - Array. Die zeitliche Komplexität wird also zu O (fooLength + barLength) . Wir haben ein Hilfsarray verwendet, um das Ergebnis zu erhalten. Die Raumkomplexität ist also auch O (fooLength + barLength) .

6. Fazit

In diesem Tutorial haben wir gelernt, wie zwei sortierte Arrays zu einem zusammengeführt werden.

Wie üblich finden Sie den Quellcode für dieses Tutorial auf GitHub.