Die Zahl in der Mitte finden

deggit_biber

Aktives Mitglied
Hallo,
ich stehe gerade etwas auf dem Schlauch. Vielleicht könnt ihr mir ja schnell weiterhelfen?
Ich habe drei Int-Variablen die in jeden Durchlauf einen anderen Int-Wert bekommen. Jetzt würde ich gerne wissen, welche dieser drei Variablen jeweils den Wert hat, der in der Mitte ist.

Ein kleines Beispiel
Durchlauf1:
z1=30
z2=70
z3=10
Rückgabe z3

Durchlauf2:
z1=6
z2=8
z3=2
Rückgabe z1

Könnte das so klappen?
Code:
    private int Mitte (int z1, int z2, int z3)
    {
        if (z1>z2 && z1<z3)
        {
            return z1
        }
    }

vielen lieben Dank für die Hilfe
Deggit
 

Robat

Top Contributor

deggit_biber

Aktives Mitglied
Ja ihr habt recht, war gestern schon spät und ich hab nicht richtig nachgedacht.

Das mit dem mittleren Element auswählen klappt jetzt auch. (habe es mit Int-Werten in einer separaten Methode einmal durchgeführt).

Leider habe ich jetzt ein anderes Problem und hier bräuchte ich wirklich eure Hilfe.

Konkret geht es um die Auswahl des Pivot-Elementes im QuickSort. Ich möchte drei random Elemente aus dem noch zu sortierenden Array auswählen und dann das mit dem mittleren Int-Wert zum pivot bestimmen.

Leider bekomme ich in dieser Zeile
p1 = arr[rnd1.nextInt(arr.length)];
eine StackOverflowError

(Wenn ich das Pivot-Element so bestimmen lasse "int pivot = arr[(left + right) / 2];" klappt der QuickSort, nur damit ihr wisst, dass der Algorithmus funktioniert.

Hier einmal mein Code

Java:
//Aufruf der Methode im Konstruktor
quicksortRandom(arr3, 0, arr1.length-1);

    void quicksortRandom(int arr[], int left, int right)
    {
        int index = partition3(arr, left, right);
        if (left < index - 1)
            quicksortRandom(arr, left, index - 1);
        if (index < right)
            quicksortRandom(arr, index, right);
    }
    int partition3(int arr[], int left, int right)
    {
        int i = left, j = right;
        int tmp;
     
        // Vergleichselement Pivot bestimmen
        int p1=0, p2=0, p3=0;
        int pivot = 0;

        Random rnd1 = new Random();
        Random rnd2 = new Random();
        Random rnd3 = new Random();

        if(arr.length>=3)
        {
            p1 = arr[rnd1.nextInt(arr.length)];   //Hier ist das Problem
            p2 = arr[rnd2.nextInt(arr.length)];
            p3 = arr[rnd3.nextInt(arr.length)];

            if (p2<p1 && p3>p1 || p2>p1 && p3<p1)  
            {
                pivot = p1;
            }
            if (p1<p2 && p3>p2 || p1>p2 && p3<p2)  
            {
                pivot = p2;
            }
            if (p1<p3 && p2>p3 || p1>p3 && p2<p3)  
            {
                pivot = p3;
            }

            if (p1==p2 || p2==p3 || p1==p3)
            {
                pivot = p1;
            }
        }
        else
        {
            pivot = arr[left];
        }


        while (i <= j)
        {
            vergleicheMitte++;
            while (arr[i] < pivot) i++;
            while (arr[j] > pivot) j--;
         
            if (i <= j)
            {
                vertauschungenMitte++;
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                i++;
                j--;
            }
        }
        return i;
    }
 

deggit_biber

Aktives Mitglied
Aber wo baue ich die Endlosrekursion?
Nehmen wir einmal diese Zahlenfolge
1,12,5,26,7,14,3,5,2 ArrayGröße(9)

1. Rekursionsschritt:
original Array, 0(left), 8(right)
index wird bestimmt partition3(arr, left, right)
pivot wird bestimmt: arr.length>=3 also ein zufälliger Int-Wert außer ich habe zwei gleiche gewählt, dann wird halt das erst welches ich mit random gewählt hatte genommen.

sagen wir einmal er hätte die 12, 7 und 2 genommen, dann wäre pivot=7

jetzt beginnt das umsortieren, bis links nur noch kleiner oder gleiche Int-Werte und recht nur noch größere oder gleiche wie zum Pivot-Element stehen.

das neue i wird zurückgegeben, wenn ich mich nicht irre müsste das der index 5 sein.

2. Rekursionsschritt
Die Methode ruft sich neu auf aber mit einem kleineren Array
if (left < index - 1)
quicksortRandom(arr, left, index - 1);
if (index < right)
quicksortRandom(arr, index, right);

0<5-1 -> Rekursion linke hälfte
5<8 -> Rekursion linke hälfte

Das Array, welches er jetzt übergibt, ist doch auch kleiner geworden oder? Also müsste das neue Pivot-Element jetzt immer aus diesem kleineren Array gewählt werden oder?

Wie geschrieben, wähle ich das Pivot-Element
so
pivot = arr
;
oder so
pivot = arr[(left + right) / 2];

klappt der Algorithmus, keine Endlosrekursion.

Es wäre sehr sehr lieb, wenn ihr mir da weiterhelfen könntet.
Viele Grüße,
Deggit​
 

deggit_biber

Aktives Mitglied
ja stimmt, das Array ist immer das selber nur left und right verändern sich.

Da könnte dann auch der Fehler liegen, weil ich das Pivot-Element immer über das ganze Array bilden lasse.

Habt Ihr/du eine Idee, wie ich das Pivot-Element jetzt nur aus den Element der neuen "Teilbereiche" bilden lassen kann?

also wie modifiziere ich mein
p1 = arr[rnd1.nextInt(arr.length)];

arr.length muss also durch eine Formel von left oder right ersetzt werden, die bei jedem Rekursionsschritt zum neuen Teilbereich passt
 

JStein52

Top Contributor
Code:
p1 = arr[left+rnd1.nextInt(right-left)];
??
Aber ohne Gewähr weil ich deinen Algo noch nicht ganz durchschaut habe ;);)
 

deggit_biber

Aktives Mitglied
Ja genau, lift-right bedeutet, er wählt einen Wert innerhalb dieser beider Grenzen, richtig?

Habe die Zeile jetzt so angepasst
Java:
p1 = arr[left+rnd1.nextInt(left-right)];

bekomme jetzt einen anderen Fehler aber in der gleichen Zeile
Fehler:
java.lang.illegalArgumentException:
bound must be positiv (in java.util.Random)

bedeutet dies, ich verwende auch negative Grenzen? so deute ich es

Hier einmal ein Link zum Verständnis meines Codes
http://www.algolist.net/Algorithms/Sorting/Quicksort
 

deggit_biber

Aktives Mitglied
ich überlege gerade, ob ich schummeln sollte. ;-)

Das Problem scheinen ja jetzt die negativen Werte zu sein. Wenn ich vorher also eine If-Abfrage machen, um zu untersuchen, ob left/right negativ sind.
Wenn ja, wähle ich das pivot einfach als index 0. Bei nein lasse ich es wie oben berechnen.

Was meinst du dazu? jetzt müsste ich nur noch wissen, wie man Int-Werte auf Negativität hin überprüft ;-)

Ach ich bin total durch, einfach schauen ob left/rigth<0

Mach ich mal eben mal sehen, ob es was bringt
 

deggit_biber

Aktives Mitglied
ne klappt leider auch net

habt das jetzt so angepasst
Java:
if (arr.length<3)
        {
            pivot = arr[0];
        }
      
        if (arr.length>=3 && left>=0 && right>=0)
        {
            p1 = arr[rnd1.nextInt(left-right)]; 
            p2 = arr[rnd2.nextInt(left-right)];
            p3 = arr[rnd3.nextInt(left-right)];

            if (p2<p1 && p3>p1 || p2>p1 && p3<p1)   
            {
                pivot = p1;
            }
            if (p1<p2 && p3>p2 || p1>p2 && p3<p2)   
            {
                pivot = p2;
            }
            if (p1<p3 && p2>p3 || p1>p3 && p2<p3)   
            {
                pivot = p3;
            }

            if (p1==p2 || p2==p3 || p1==p3) 
            {
                pivot = p1;
            }
        }

Bekomme beim Ausführen immer noch diesen Fehler
java.lang.illegalArgumentException:
bound must be positiv (in java.util.Random)
 

deggit_biber

Aktives Mitglied
ja jetzt ist es klar. ich bin ja so ein depp!!!

Aber kannst du mir noch einmal
p1 = arr[left+rnd1.nextInt(right-left)];
erklären?

ist hier left die erste Grenze und right-left die zweite?
Warum schreibe ich nicht
p1 = arr[left+rnd1.nextInt(right)];
?
Ich glaube ich habe das ganze noch nicht geblickt!

vielen lieben Dank für eure Hilfe
 

JStein52

Top Contributor
public int nextInt(int bound)

Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence.
 

deggit_biber

Aktives Mitglied
ok int nextInt(int bound) macht zwischen 0 und bound das verstehe ich.

Aber wie
p1 = arr[left+rnd1.nextInt(right-left)];
zwischen left(min) und right(max) macht, dass verstehe ich noch nicht. warum das right-left?
 

JStein52

Top Contributor
Es wird zu left eine zufaellige Zahl zwischen 0 und right-left dazuaddiert. Und right-left ist der "Ausschnitt" des arrays der dich interessiert.

Edit: evtl. fehlt noch ein +1 (right-left+1) je nachdem was du willst.
 

deggit_biber

Aktives Mitglied
ahhh jetzt hab ichs.

Sagen wir der Ausschnitt geht von index 5 bis 10

dann wird eine Zufallszahl zwischen 5 und 10 so gebildet

left(5) + eine zufällige Zahl die zwischen right-left liegt.

ich muss dabei rigth-left nehmen, damit keine 11,12,usw. entstehen kann
 

DefconDev

Bekanntes Mitglied
Also der der Code aus dem ersten post ist nach meinem Verständnis absolut falsch. Was passiert wenn zwei zahlen den selben Wert besitzen. Was geschieht wenn z1 größer als z2 und größer als z3... die Mitte wurde nicht gefunden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
A Methoden Guten Tag , ich wollte so machen dass wenn meine frog an eine fly/bee geht dann an meine Tafel geht der zahl +1 hoch. Java Basics - Anfänger-Themen 2
B Überprüfung dass Zahl nur aus 0,1 besteht Java Basics - Anfänger-Themen 2
S Vollkommene Zahl berechnen und ausgeben Java Basics - Anfänger-Themen 16
B Hashmap richtig bauen, die Tripel auf Zahl abbildet? Java Basics - Anfänger-Themen 10
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
B 49-bit-zahl mit genau 6 Einsen bauen? Java Basics - Anfänger-Themen 21
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
M Java Ausgabe der höchsten Zahl Java Basics - Anfänger-Themen 14
Thomas06 Wie kann man mithilfe von boolean herausfinden ob eine zahl durch 5 und 7 teilbart ist ? Java Basics - Anfänger-Themen 7
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
M zahl raten Java Basics - Anfänger-Themen 1
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
sserio Prüfen, ob eine Zahl eine periodische Zahl ist Java Basics - Anfänger-Themen 20
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
I Zahl aufrunden (Zeit) Java Basics - Anfänger-Themen 43
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
TanTanIsTrying Durschnitt berechnen von eingegebener Zahl bis 1 heruntergezählt Java Basics - Anfänger-Themen 9
R Fortlaufende Zahl Java Basics - Anfänger-Themen 3
A Wenn eine Zahl durch 7 teilbar ist, soll statt der Zahl ein ‘*‘ angezeigt werden. java? Java Basics - Anfänger-Themen 47
K Warum gibt mir z. B. 40^128 eine Zahl? Ich dachte mit xor kann man nur booleanwerte erhalten, also prüfen ob etwas whar oder falsch ist? Java Basics - Anfänger-Themen 1
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
Q Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann. Java Basics - Anfänger-Themen 20
HelpInneed Zahl. Java Basics - Anfänger-Themen 2
R Perfekte Zahl Java Basics - Anfänger-Themen 8
D Mittlerste Zahl Java Basics - Anfänger-Themen 17
D Grösste Zahl in einer Folge herausfinden. (ULAM) Java Basics - Anfänger-Themen 9
Poppigescorn Häufigkeit einer zahl zählen Java Basics - Anfänger-Themen 5
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
Poppigescorn scan.nextInt() wiederholen bis eine Zahl eingeben wird Java Basics - Anfänger-Themen 7
J Verdoppeln einer Zahl (in dem Fall Münzen) Java Basics - Anfänger-Themen 4
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
S Algorithmus (reelle Zahl <65536 von dezimal zu dual) max. 10 Nachkommastellen Java Basics - Anfänger-Themen 4
K Wie kontrolliere ich ob ich die Zahl in meinem Array schon hab? Java Basics - Anfänger-Themen 9
T Zahl in Array ersetzen Java Basics - Anfänger-Themen 2
Abraham42 Prozentsatz einer Zahl mehrmals Java Basics - Anfänger-Themen 2
C Größte Zahl aus einem Array ermitteln(als statische Methode) Java Basics - Anfänger-Themen 31
Kingamadeus2000 Anzahl der Ziffern der kürzesten Zahl aus einem zurückliefern Java Basics - Anfänger-Themen 1
V Beliebige Dreistellige Zahl Teiler finden Java Basics - Anfänger-Themen 4
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
W Random Zahl unter Berücksichtung eines Durchschnitts Java Basics - Anfänger-Themen 7
S Zahl eingeben Java Basics - Anfänger-Themen 8
A Java . punkt neben einer Zahl. Java Basics - Anfänger-Themen 1
F Eine Zahl mit Arrays vergleichen Java Basics - Anfänger-Themen 7
J Die größte Zahl anzeigen Java Basics - Anfänger-Themen 19
V Array auf eine Zahl durchsuchen Java Basics - Anfänger-Themen 15
X Nach einem Bruch testen ob es eine ganze Zahl ist Java Basics - Anfänger-Themen 6
L Erhöhung der Zahl Java Basics - Anfänger-Themen 3
F Negative Zahl erzwingen Java Basics - Anfänger-Themen 3
N Eine Zahl solange teilen bis es nicht möglich ist und die Ergebnisse ausgeben Java Basics - Anfänger-Themen 23
T Eulersche Zahl e Java Basics - Anfänger-Themen 5
S Letzte Zahl eines Integer auslesen? Java Basics - Anfänger-Themen 3
G Programm schreiben: Zahl (n) eingeben, 1+1/n+2/n+3/n+....+n/n Java Basics - Anfänger-Themen 8
B Eine ganze Zahl zerlegen. Java Basics - Anfänger-Themen 4
J Fehler beim generieren von 4 Zufallszahlen Zahl doppelt ist eigentlich ausgeschlossen Java Basics - Anfänger-Themen 9
H Harshad-Zahl (Nivenzahl) und Palindrom überprüfen Java Basics - Anfänger-Themen 2
I Wie viele 1 an Bits hat die Zahl x? Java Basics - Anfänger-Themen 5
A Gewürfelte Zahl ausgeben Java Basics - Anfänger-Themen 10
M Rationale Zahl erkennen - Kurze Frage zum Restwert nach Division Java Basics - Anfänger-Themen 3
A Überprüfen, ober eine Zahl Ziffer enthält Java Basics - Anfänger-Themen 12
O Markoff-Zahl Java Basics - Anfänger-Themen 22
B Datenbank, aktuelle Ende als Zahl an Label übergeben Java Basics - Anfänger-Themen 7
L 10-Stellige Zahl hochzählen lassen Java Basics - Anfänger-Themen 1
H String und Zahl Java Basics - Anfänger-Themen 10
R Zahl 1 bis 100 erraten Java Basics - Anfänger-Themen 12
Y Konkrete Hilfe gesucht - Anzahl der Stellen einer eingegebenen Zahl überprüfen Java Basics - Anfänger-Themen 5
J Button klick bei eine bestimmten Zahl Java Basics - Anfänger-Themen 8
B Zahl in String abspeichern und später berechnen Java Basics - Anfänger-Themen 15
H OOP eine Zahl immer weiter durch 2 teilen Java Basics - Anfänger-Themen 15
J Für jeden Buchstaben eine Zahl Java Basics - Anfänger-Themen 1
H Würfelspiel, stop bei gleicher Zahl Java Basics - Anfänger-Themen 4
B Array - die Häufigkeit der Zahl zählen Java Basics - Anfänger-Themen 9
I Erste Schritte Testen, ob eine Zahl eine Primzahl ist Java Basics - Anfänger-Themen 8
J Rekursive Methode - Ziffern einer Zahl ausgeben Java Basics - Anfänger-Themen 2
I Eulersche Zahl Java Basics - Anfänger-Themen 6
F Produkt d. Ziffern einer Zahl..?! Java Basics - Anfänger-Themen 5
J Die Zahl herausfinden die durch 2 - 30 Teilbar ist... Java Basics - Anfänger-Themen 17
A Ungeordnetes Array ordnen, Zahl einlesen und einordnen Java Basics - Anfänger-Themen 23
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
T Datentypen char als Buchstaben statt als Zahl ausgeben Java Basics - Anfänger-Themen 4
S Jede Ziffer einer Zahl auslesen, damit rechnen und beim Ergebnis wiederholen ? Java Basics - Anfänger-Themen 20
H 32-Bit Zahl (Integer) in eine IPv4 Adresse umwandeln? Java Basics - Anfänger-Themen 2
Aprendiendo Gibt es in der JAVA-API eine Funktion, die eine Dezimalzahl in eine binäre Zahl umwandelt? Java Basics - Anfänger-Themen 8
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
D String erste Zahl mit LKZ auslesen lassen Java Basics - Anfänger-Themen 36
C Erste Ziffer einer Zahl Java Basics - Anfänger-Themen 46
M Zeilenumbruch ab der 10. Zahl Java Basics - Anfänger-Themen 11
T Input/Output Int Eingabe auf Zahl überprüfen Java Basics - Anfänger-Themen 30
R Input/Output zahl aus showInputDialog() Java Basics - Anfänger-Themen 25
S Rekursives Zählen einer Zahl Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben