Java, zwei Arrays nach größe sortieren und in einen weiteren Array einfügen?

2 Antworten

Ich gehe mal kurz durch, was dein Code macht:

Du hast die beiden Input-Arrays und ein Ergebnisarray, was so groß ist, wie die beiden Input Arrays zusammen:

ArrayEins: { 4, 3, 2, 1, 0 } 
ArrayZwei: { 9, 8, 7 }
Ergebnis : { 0, 0, 0, 0, 0, 0, 0, 0 }

Bis dahin passt es. In der Schleife gibt es aber drei Probleme.

Problem eins: Du schreibst einen Wert ins Ergebnisarray, der noch gar nicht dran ist:

             v
ArrayEins: { 4, 3, 2, 1, 0 } 
ArrayZwei: { 9, 8, 7 }
Ergebnis : { 9, 4, 0, 0, 0, 0, 0, 0 }
                ^ Die 4 gehört da nicht hin

Problem zwei: Du überschreibst Werte, die schon im Ergebnis stehen:

                v
ArrayEins: { 4, 3, 2, 1, 0 } 
ArrayZwei: { 9, 8, 7 }
Ergebnis : { 9, 8, 3, 0, 0, 0, 0, 0 }
                ^ Die 4 wurde durch die 8 überschrieben

Problem drei: Du versuchst Werte außerhalb der Array-Grenzen zu lesen:

                      v Der Wert aus ArrayZwei kann hier nicht gelesen werden
ArrayEins: { 4, 3, 2, 1, 0 } 
ArrayZwei: { 9, 8, 7 }
Ergebnis : { 9, 8, 7, 2, 0, 0, 0, 0 }

Die Lösung: Du brauchst für jedes der drei Arrays eine Variable, in der die aktuelle Position steht. Wenn der Wert aus Array1 größer ist oder Array2 zu Ende ist, dann schreib den Wert aus Array1 in das Ergebnis, ansonsten schreib den Wert aus Array2 ins Ergebnis und erhöhe jeweils den Zeiger für das Array, aus dem du den Wert gelesen hast.

Erst die Arrays zusammenfügen und dann den zusammengefügten Array sortieren.

Zum zusammenkopieren verwende bitte System.arraycopy, das sollte effizient sein.

Zum sortieren verwende bitte auch einen Sortieralgorithmus, der effizient ist, beispielsweise Mergesort.

Mergesort einfach erklärt:

Du teils den Array jeweils sukzessive soweit, bis du nur noch zwei Elemente hast (sprich den ersten Array in zwei Arrays, dann diese zwei Arrays jeweils inw eitere zwei Arrays, etc.).
Sobald du nur noch zwei Elemente hast, sortierst du diese.

Danach nimmst du die zwei Arrays und gehst sie der reihe nach durch, vergleichst immer das aktuelle Element des einen Arrays mit dem akutuellem Element des anderen Arrays. In den Ergebnisarray schreibst du jeweils das kleinere der beiden Elemente und gehst dann zum nächsten Element über.

Wenn du es dir einfach machen möchtest, dann implementierst du das rekursiv. Wenn du es effizient haben möchtest, dann schaust du, dass du das in situ und iterativ realisierst.