# Sortieren(Algorithmen)



## hos15 (27. Jan 2017)

Hallo alle zusammen. Ich habe folgende Aufgabe : 
Nehmen wir an wir haben ein Feld: 
[feld=[3, 2, 3, 7, 6, 6, 7, 8, 7, 4]]

1) Wie groß ist der minimale Abstand zwischen zwei gleichen Werten (im Beispiel: 1 für die 6) 
2) Wie groß ist der maximale Abstand zwischen zwei gleichen Werten (im Beispiel: 5 für die 7)
3) Wie viele Werte im Feld lassen sich als Produkt zweier anderer Werte (ungleich 1) aus dem Feld schreiben? (Im Beispiel: 6 = 2 ∗ 3, 8 = 2 ∗ 4 also 2) 
4) gleiche Frage für Summe / Dierenz 
5) Von welchem Wert sind die meisten ganzzahligen Vielfache im Feld? (Im Beispiel 2)

Kann mir einer helfen bitte ?


----------



## Joose (27. Jan 2017)

Hast du denn schon einen Ansatz? Wo genau liegt das Problem?



hos15 hat gesagt.:


> 1) Wie groß ist der minimale Abstand zwischen zwei gleichen Werten (im Beispiel: 1 für die 6)
> 2) Wie groß ist der maximale Abstand zwischen zwei gleichen Werten (im Beispiel: 5 für die 7)


Wenn du eines von beiden gelöst hast ist das andere eig auch gelöst 
Mit 2 verschachtelten Schleife sollte sich diese Problem lösen lassen.


----------



## hos15 (27. Jan 2017)

Also Ja ich habe einen ansatz und zwar so :



```
void minAbstand( ) {
   int temp = 0;
   for(int i = 0; i < feld.length; i++) {
       for(int j = N; j > i; N--) {
           if(feld[i] == feld[j]) {
               temp = Math.abs(i - j);
               System.out.println("MinimumAbstand" + temp);
           }
       }
   }
}
```

stimmt das ?


----------



## Joose (27. Jan 2017)

hos15 hat gesagt.:


> stimmt das ?


Was soll ich darauf antworten? 
Du hast deinen Code, ein Angabe und die Lösung. Nimm deine IDE, kompiliere den Code und führe ihn aus. Kommt das richtige heraus?

An deinem Code gibts einige unklare Stellen:
Was ist "N"?
Deine innere Schleife wird endlos laufen, weil du "j" nicht verringerst.
Du speicherst zwar den aktuell berechneten Abstand aus und gibst ihn aus. Du solltest ihn aber speichern und mit dem vorherigen berechneten Abstand vergleichen (welcher ist größer/kleiner).


----------



## hos15 (27. Jan 2017)

Also hab einige dinge verbessert : 


```
void minAbstand() {
        int temp = 0;
        
        for (int i = 0; i < feld.length; i++) {
            for (int j = N - 1; j > i; j--) {
                if (feld[i] == feld[j]) {
                    temp = Math.abs(i - j);

                    System.out.println("MinimumAbstand von " + feld[i] + " " + temp);

                }

            }
        }


    }
```



> Du solltest ihn aber speichern und mit dem vorherigen berechneten Abstand vergleichen (welcher ist größer/kleiner).



wie ich das machen soll weiß ich nicht ganz


----------



## Joose (27. Jan 2017)

Basierend auf deinem Code könnte das wie folgt ausschauen:

```
void minAbstand() {
   int minimum = -1;

   for (int i = 0; i < feld.length; i++) {
       for (int j = N - 1; j > i; j--) {
           if (feld[i] == feld[j]) {
               int temp = Math.abs(i - j);
               System.out.println("MinimumAbstand von " + feld[i] + " " + temp);
               // temp muss mit minimum verglichen werden
           }
       }
   }
}
```
Deine Ausgabe in der Schleife ist so wie sie da steht unsinnig  .... "minimumAbstand von x" --> "zu y" fehlt da


----------



## hos15 (27. Jan 2017)

Mhh aber warum -1 ? der kleinste wert kann ja nur 1 sein


----------



## Joose (27. Jan 2017)

Da es sich bei minimum um ein "int" handelt brauchst du einen Initialwert. Am besten ein ziemlich großer Abstand oder ein unmöglicher Abstand.

Ein Abstand ist immer positiv, also kann er nie < 0 werden. Somit bietet sich zum Beispiel "-1" an.
Oder du nimmst die Länge des Arrays als Initialwert  es bleibt eben dir überlassen.

Den 1.Abstand den du dir ausrechnest vergleichst du dann mit dem "minimum", wenn der Abstand kleiner ist als das bisherige "minimum" dann speicherst du den Abstand als neues "minimum" usw.


----------



## hos15 (27. Jan 2017)

Ja aber der kann ja nie kleiner als -1 sein 

```
void minAbstand() {
        int min = -1;
         int temp=0;
        for (int i = 0; i < feld.length; i++) {
            for (int j = N - 1; j > i; j--) {
                if (feld[i] == feld[j]) {
                    temp = Math.abs(i - j);
                } 
                if(temp<min){
                    System.out.println(temp);
                }             
            }         
        }
    }
```


----------



## Joose (30. Jan 2017)

1) `temp < min` musst du nur vergleichen wenn du 2 gleiche Zahlen gefunden hast (sprich das eine if ins andere if geben )
2) Dann erweitere doch deine Bedingung um `|| temp == -1` oder wie ich oben schon geschrieben habe kannst du einen großen unmöglichen Wert nehmen (zum Beispiel die Arraygröße)


----------

