Ok, damit hast Du es doch schon fast. Bei so Fragen ist immer die Frage: Was genau funktioniert nicht? Das würde es uns einfacher machen, dir weiter zu helfen:
Es gibt ein paar Probleme, die ich sehe. Fangen wir mal mit den einfachen Dingen an:
a) (Schönheit) Die Berechnung der Hälfte ist - sagen wir mal - kreativ
Bei einem ungeraden Integer reicht ein / 2 - denn es kommt ja ein Integer heraus. Ein -1 wird also nicht benötigt. Die Hälfte ist dann also ein length/2 + 1. Und wenn man das noch umschreibt zu if (length % 2 == 0) haelfte = length/2 + 0 else haelfte = length/2 + 1 dann siehst Du: Du addierst jeweils length%2. Damit kannst Du direkt ohne if schreiben:
int haelfte = array.length / 2 + array.length%2;
(Bezeichner habe ich jetzt nicht aus dem Bildschirmfoto heraus gesucht ... Bitte Code in Code Tags schreiben!)
b) (Fehler!)
Dein 2D Array ist einfach falsch erzeugt. mit dem [1]
hast Du nur den index 0 - Du willst aber doch 2 Elemente unter bringen also index 0 und 1 - die Größe muss also 2 sein.
Das Array, das Du generierst: Ein 2D Array ist ein Array of Arrays. Und wenn Du zwei Arrays haben willst, dann wäre die 2 vorne. Du kannst also erst einmal ein Array erzeugen mit
int[][] arr2d = new int[2][];
Damit hast Du nur ein Array erzeugt und die "Unter-Arrays" sind noch null.
nun kannst Du jeweils ein Ziel-Array erzeugen, also z.B.
arr2d[0] = new int[whatever];
` (bzw. mit index 1 für das zweite. whatever muss natürlich die Größe sein. Das ist einmal die haelfte und das zweite musst Du wieder dynamisch angeben. Da kannst Du Dir überlegen, wie Du das machen kannst. Ich selbst hätte da einfach gesagt: die restlichen Elemente sollen da rein - wie viel sind die restlichen Elemente?
Im Anschluss kannst Du das erstellte Array füllen. Dazu kannst Du eine Schleife universell laufen lassen von 0 bis < length des zu füllenden Arrays.
Das nur als ein paar Ideen. Den eigentlichen Fehler habe ich fett markiert.