# 2 Arrays mischen



## DerEineDa (16. Nov 2018)

Zwei sortierte Arrays sollen gemischt werden, so dass ein ebenfalls sortiertes Gesamt-Array herauskommt.

Bis zur Zahl 9 klappt alles auch perfekt. Danach scheitert es an der letzten Zahl, weil:
Die beiden Arrays sind unterschiedlich lang. Bedeutet beim letzten Durchlauf vergleicht er array1 and der letzten Position mit array2 an der letzten Position. Und da 9 größer als 10 ist, gibt er als letztes 9 aus, anstatt die 10.

Jemand eine Idee wie man das Problem lösen könnte?


```
public static void main (String[] args) {
        int [] array1 = { 1 , 3 , 3 , 5 , 6 , 9 };
        int [] array2 = { 2 , 3 , 5 , 7 , 8 , 9, 10 };
        int [] result = new int [13];
       
       
        // ab hier beginnt die Aufgabe
        int a = 0;
        int b = 0;
        int k = 0;
       
        while (k < result.length) {
            if (array1[a] < array2[b]) {
                result[k] = array1[a];
                k++;
                if (a < array1.length - 1) {
                    a++;
                }
            }
           
            else if (array1[a] > array2[b]) {
                result[k] = array2[b];
                k++;
                if (b < array2.length - 1) {
                    b++;
                }
            }
           
           
            else if (array1[a] == array2[b]) {
                result[k] = array1[a];   
                k++;
                if (a < array1.length - 1) {
                    a++;
                }
                result[k] = array2[b];
                k++;
                if (b < array2.length - 1) {
                    b++;
                }
            }       
        }
        // bis hier
       
        for (int i = 0; i < result.length; i++) {
            System.out.print(result[i] + " ");
        }
        System.out.println() ;
        // output : 1 2 3 3 3 5 5 6 7 8 9 9 10
    }
```


----------



## Xyz1 (16. Nov 2018)

DerEineDa hat gesagt.:


> Zwei sortierte Arrays sollen gemischt werden, so dass ein ebenfalls sortiertes Gesamt-Array


mischen oder mergen 

Siehe mal in den Cormen ab Seite 1047 ff.

Ich werde nachher danach schauen.


----------



## DerEineDa (16. Nov 2018)

DerWissende hat gesagt.:


> mischen oder mergen
> 
> Siehe mal in den Cormen ab Seite 1047 ff.
> 
> Ich werde nachher danach schauen.



Leider hab ich das Cormen nicht (falls es nach meinen Recherchen ein Buch ist). Aber danke


----------



## Javinner (16. Nov 2018)

@DerEineDa 
Google sagt ja! Der erste und zweite Link..


----------



## Xyz1 (16. Nov 2018)

2. Auflage

Wie würdest Du das denn per Hand mit zwei Kartenstapeln mit Karten von 1 bis 10 machen? 

Wann muss wann wie verglichen und umgelegt werden. 

Tipp 3: Müssen alle Karten durchgesehen werden?

Weisheit des Tages: Konfuzius sagt, Es ist besser, ein einziges kleines Licht anzuzünden, als die Dunkelheit zu verfluchen


----------



## mihe7 (16. Nov 2018)

@DerEineDa guckst Du https://de.wikipedia.org/wiki/Mergesort


----------



## Xyz1 (16. Nov 2018)

mihe Du Füchsin, wer hat Dir das gesagt?


----------



## mihe7 (16. Nov 2018)

DerWissende hat gesagt.:


> Du Füchsin


?!? 


DerWissende hat gesagt.:


> wer hat Dir das gesagt?


Der Teufel natürlich, wer sonst?


----------



## Xyz1 (16. Nov 2018)

Ich muss mich übrigens berichtigen, Merge steht schon auf Seite 29, 30, 31 und 32....
Nich dass der Eindruck entstünde ich hätte das ganze Buch gelesen.

@mihe7 Ist das neuerdings Beleidigung? Wollte freundlich sein


----------



## mihe7 (16. Nov 2018)

DerWissende hat gesagt.:


> Ist das neuerdings Beleidigung?


Nö, aber wieso "in"? Und dass mir das der Teufel gesagt haben muss, steht ja schon hier https://de.wikipedia.org/wiki/Rumpelstilzchen


----------



## Xyz1 (16. Nov 2018)

@mihe7 Na gut, dann nenne ich Dich ab heute nur noch Hanswurst


----------



## mihe7 (16. Nov 2018)

Du, so lange es Dich glücklich macht...  

Der Hans Wurst ist fester Bestandteil meiner Testdatensätze


----------



## Xyz1 (16. Nov 2018)

mihe7 hat gesagt.:


> Der Hans Wurst ist fester Bestandteil meiner Testdatensätze


Jetzt brauche ich erstmal etwas von dem guten Russian Standard Vodka 1894 
bis später.


----------



## DerEineDa (18. Nov 2018)

mihe7 hat gesagt.:


> @DerEineDa guckst Du https://de.wikipedia.org/wiki/Mergesort


Danke, hat geholfen


----------



## DerEineDa (18. Nov 2018)

DerEineDa hat gesagt.:


> Danke, hat geholfen


Hier die Version die funktioniert, für jeden den es interessiert

```
int a1 = array1.length - 1;
        int a2 = array2.length;
        int k = 0;
      
        for (int i = 0; i < a1 + a2 + 1; i++) {
            if (k > a1) {
                result[i] = array2[i-k];
            }
            else if (k < i - a2) {
                result[i] = array1[k];
                k++;
            }
            else if (array1[k] <= array2[i-k]) {
                result[i] = array1[k];
                k++;
            }
            else {
                result[i] = array2[i-k];
            }
        }
```


----------



## Xyz1 (18. Nov 2018)

Ich schaff weniger 

```
System.out.println(Arrays.toString(mer(new int[]{2}, new int[]{1, 2, 3})));
}

static int[] mer(int[] a, int[] b) {
    int[] c = new int[a.length + b.length];
    int i = 0;
    int j = 0;
    int k = 0;
    while (k < a.length + b.length) {
        if (j >= b.length || (i < a.length && a[i] <= b[j])) {
            c[k++] = a[i++];
        } else {
            c[k++] = b[j++];
        }
    }
    return c;
}
```


----------



## mihe7 (18. Nov 2018)

@DerWissende jetzt bin ich aber enttäuscht. Wo bleibt der Stream-Einzeiler?


----------



## Xyz1 (18. Nov 2018)

mihe7 hat gesagt.:


> Wo bleibt der Stream-Einzeiler


Dann brauche ich erst ein Schlückchen von dem guten Vodka und besaufen will ich mich heute nich

Spaß beiseite ich glaube dieses mal bei sehr schwer anzufangen würd der TE nich verstehen.


----------



## Sdxo123 (19. Nov 2018)

```
public static int[] abc(int[] werte, int[] werte2) {
  int[] neuarray = new int[werte.length+werte2.length];
 
  for (int i = 0; i < werte.length; i++) {
    neuarray[i] = werte[i];
  }
  for (int j =0; j < werte2.length; j++) {
    neuarray[j+werte.length] =werte2[j];
  }
     
  for (int i = 0; i < neuarray.length; i++) {
    for (int j =0; j < neuarray.length; j++) {
      if (neuarray[i] < neuarray[j]) {
        int temp = neuarray[i];
        neuarray[i] = neuarray[j];
        neuarray[j] = temp;
      }
    }
  }
}
```


----------



## mihe7 (19. Nov 2018)

@Sdxo123 
1. bitte Code-Tags verwenden [code=Java]Dein Code[/code]
2. was Du machst, ist zwei Arrays in ein neues zu kopieren und anschließend zu sortieren (und das noch dazu recht ineffizient - das j muss nicht von 0 beginnen). Das funktioniert zwar, geht aber am Thema vorbei, weil nicht ausgenutzt wird, dass die beiden Arrays bereits sortiert sind


----------



## Xyz1 (19. Nov 2018)

@Sdxo123 , @mihe7 hat es toll erklärt....
Tatsächlich ließe sich, so man es verbessern wollte, nur die k-Variable zu lasten der Übersichtlichkeit einsparen....


----------

