Minimumsuche mit Zähler

Lycidas92

Mitglied
Hallo,

Ich habe folgendes Problem. Ich habe vor kurzen angefangen mich ein bisschen in die Java Programmiersprache reinzuarbeiten und habe eine kleine Frage bezüglich der Minimumsuche. Das Programm läuft bereits:

Java:
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class Minimum extends Frame {

    int h[] = new int[101];

    public Minimum() {
        int i;
        Random r = new Random();        
        for (i=1;i<=100;i++) {
            h[i]=(int)(r.nextDouble()*80);
        }
    }

    public void paint(Graphics g) {
        int i;
        int min;
        int j;
        int l;
        int hilfsvar;

        g.setColor(Color.white);
        g.fillRect(0,0,505,120);
        g.setColor(Color.black);
        for (l=1;l<=100;l++) {
            g.fillRect(l*5,120-h[l],3,h[l]);
        }
        
        for (i=1;i<=100;i++) {
            min=i;
            for (j=i+1;j<=100;j++) {
            for (int pause=0;pause<100000;pause++) {}
                if (h[j]<h[min]) min=j;
            }
            g.setColor(Color.white);
            g.fillRect(min*5,20,5,100);
            g.fillRect(i*5,20,5,100);
            hilfsvar = h[min];
            h[min]=h[i];
            h[i]=hilfsvar;
            g.setColor(Color.black);
            g.fillRect(min*5,120-h[min],3,h[min]);
            g.fillRect(i*5,120-h[i],3,h[i]);
        }
    }

    public static void main (String [] args) {
        Minimum sprog = new Minimum();
        WindowListener wl = new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.out.println("... und aus ;-)");
                    System.exit(0);
                }
            };
        sprog.addWindowListener(wl);
        sprog.setTitle("Sortieren durch Minimumsuche");
        sprog.setLocation(100,100);
        sprog.setSize(520,120);
        sprog.show();
    }
}

Nun möchte ich folgenden Zähler einbauen:

Java:
...
public class Quick extends Frame {

    static long vergleichezaehler;
    static long tauschzaehler;    
    int h[] = new int[101];

    public void sortiere(Container ct, int l, int r) {
        ...
        eintrag = h[(int)((l+r)/2)];
        do {
            vergleichezaehler++;
            while (h[i]<eintrag) {
                vergleichezaehler++;
                i++;
            }
            while (eintrag<h[j]) {
                vergleichezaehler++;
                j--;
            }
            if (i<=j) {
                g.setColor(Color.white);
                g.fillRect(i*5,20,5,100);
                g.fillRect(j*5,20,5,100);
                hilfsvar=h[i];
                h[i]=h[j];
                h[j]=hilfsvar;
                tauschzaehler++;
                g.setColor(Color.black);
                g.fillRect(i*5,120-h[i],3,h[i]);
                g.fillRect(j*5,120-h[j],3,h[j]);
                i++;
                j--;
            }
        } while (i<=j);
        if (l<j) sortiere(ct, l, j);
        if (r>i) sortiere(ct, i, r);
    }


    public static void main (String [] args) {
        Quick sprog = new Quick();
        WindowListener wl = new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.out.println(vergleichezaehler + " Vergleiche");
                    System.out.println(tauschzaehler + " Austausche");
                    System.exit(0); 
                }
            };
        ...
    }
}

Ich weiß das ich diesen Zähler hinter den Teil bei der Minimumsuche einsetzten muss, der für die Zähl bzw Austausch Operationen verantwortlich ist. Ich habe wirklisch schon alles versucht... Ich hoffe ihr könnt mir weiterhelfen.
 

ARadauer

Top Contributor
WTF!!! for (int pause=0;pause<100000;pause++) {}
;(
Thread.sleep verwenden!!!!!!!

du must versuchen deine konkrete Logik zum Sortieren der Zahlen vom Zeichnen zu trennen.
 
Zuletzt bearbeitet:

Der Müde Joe

Top Contributor
Aber sicher nicht in der paint-Methode ein Thread.sleep machen (auch kein for(...)).
Sonst friert ja das ganze Programm ein.
Das ganze Sortieren sollte man in einem Thread machen und dann das Gui über den
neuen status informieren, und das Gui dann nur zeichnen lassen.
 

Der Müde Joe

Top Contributor
ca so sollte das aussehen:
Java:
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Sorter {

	private JPanel panel;

	final List<Integer> list;

	public Sorter(List<Integer> list) {
		this.list = list;
		init();
		// in einem anderen thread wird sortiert
		SorterThread run = new SorterThread();
		new Thread(run).start();
	}

	private void init() {
		JFrame frame = new JFrame("sorter");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(500, 500);
		panel = new JPanel() {

			@Override
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				// hier wird alles gezeichnet
				for (int i = 0; i < list.size(); i++) {
					g.drawLine(i * 2, 0, i * 2, 400 / (list.get(i) + 1));
				}
			}
		};
		frame.getContentPane().add(panel);
		frame.setVisible(true);
	}

	public static void main(String... _) {
		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		for (int i = 0; i < 100; i++) {
			arrayList.add(i);
		}
		Collections.shuffle(arrayList);
		new Sorter(arrayList);
	}

	/**
	 * runnable, welches das eigentliche sortieren macht.
	 */
	private class SorterThread implements Runnable {

		@Override
		public void run() {
			while (true) {
				// sortiere einen Schritt (ok hier einfach mal durcheinander machen)
				Collections.shuffle(list);
				// zeichne das Panel neu
				panel.repaint();
				try {
					// warte ein wenig
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
 
S

SlaterB

Gast
was ein Zähler allgemein ist, ist unbekannt, zumindest kann man den nicht pauschal 'irgendwo einbauen', dein Code ist leider auch eher wirr,
beschreib doch mit Worten, was ungefähr passieren soll,

und was spricht dagegen, irgendwo eine Variable zu deklarieren und woanders variable++; auszuführen, wie du es ungefähr schon hast?
bekommst du Compilerfehler, wird falsch gezählt?
 
S

SlaterB

Gast
also dein alter Code

> static long vergleichezaehler;
> static long tauschzaehler;

> vergleichezaehler++;

usw., klappt das nicht?
wenn du mehrfach zählen willst, sind statische Variablen natürlich gefährlich, muss man zum richtigen Zeitpunkt auf 0 setzen,
es dürfen nicht mehrere Dinge gleichzeitig gezählt werden,

sind sie nicht statisch, hat man andere Probleme (trotzdem natürlich Standard, zu empfehlen),

aber wie ich eigentlich schon gessagt habe, einbauen, was genau klappt nicht?
(und bei meinem nächsten Posting werde ich garantiert eine Zeile weniger als in deinem Posting schreiben, wenn das wieder nur eine wird.. ;) )
 

Lycidas92

Mitglied
ich habe versucht den Zähler hinter den Teil der Minimumsuche zu bauen, der für die Tausch bzw Vergleich Operationen zuständig ist. Ich bin mir noch nichtmal sicher ob ich das richtig gemacht habe, denn jedes ma kommen ca 60 Fehler im Compiler.
 

Lycidas92

Mitglied
Java:
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class Minimum extends Frame {

    int h[] = new int[101];

    public Minimum() {
        int i;
        Random r = new Random();
        for (i=1;i<=100;i++) {
            h[i]=(int)(r.nextDouble()*80);
        }
    }

    public void paint(Graphics g) {
        int i;
        int min;
        int j;
        int l;
        int hilfsvar;

        g.setColor(Color.white);
        g.fillRect(0,0,505,120);
        g.setColor(Color.black);
        for (l=1;l<=100;l++) {
            g.fillRect(l*5,120-h[l],3,h[l]);
        }

        for (i=1;i<=100;i++) {
            min=i;
            for (j=i+1;j<=100;j++) {
            for (int pause=0;pause<100000;pause++) {}
                if (h[j]<h[min]) min=j;
            }
            ...
public class Quick extends Frame {

    static long vergleichezaehler;
    static long tauschzaehler;
    int h[] = new int[101];

    public void sortiere(Container ct, int l, int r) {
        ...
        eintrag = h[(int)((l+r)/2)];
        do {
            vergleichezaehler++;
            while (h[i]<eintrag) {
                vergleichezaehler++;
                i++;
            }
            while (eintrag<h[j]) {
                vergleichezaehler++;
                j--;
            }
            if (i<=j) {
                g.setColor(Color.white);
                g.fillRect(i*5,20,5,100);
                g.fillRect(j*5,20,5,100);
                hilfsvar=h[i];
                h[i]=h[j];
                h[j]=hilfsvar;
                tauschzaehler++;
                g.setColor(Color.black);
                g.fillRect(i*5,120-h[i],3,h[i]);
                g.fillRect(j*5,120-h[j],3,h[j]);
                i++;
                j--;
            }
        } while (i<=j);
        if (l<j) sortiere(ct, l, j);
        if (r>i) sortiere(ct, i, r);
    }


    public static void main (String [] args) {
        Quick sprog = new Quick();
        WindowListener wl = new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.out.println(vergleichezaehler + " Vergleiche");
                    System.out.println(tauschzaehler + " Austausche");
                    System.exit(0);
                }
            };
        ...
    }
}
            g.setColor(Color.white);
            g.fillRect(min*5,20,5,100);
            g.fillRect(i*5,20,5,100);
            hilfsvar = h[min];
            h[min]=h[i];
            h[i]=hilfsvar;
            g.setColor(Color.black);
            g.fillRect(min*5,120-h[min],3,h[min]);
            g.fillRect(i*5,120-h[i],3,h[i]);
        }
    }

    public static void main (String [] args) {
        Minimum sprog = new Minimum();
        WindowListener wl = new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            };
        sprog.addWindowListener(wl);
        sprog.setTitle("Sortieren durch Minimumsuche");
        sprog.setLocation(100,100);
        sprog.setSize(520,120);
        sprog.show();
    }
}

ich weiß nicht ob ich den Zähler an die richtige Stelle gesetzt habe villeicht ist das das Problem
 
S

SlaterB

Gast
also mit all den ... kompiliert bei mir wenig,
was du an Fehlern hast hast du immer noch nicht verraten,
da kann ich nicht helfen

Tipp:
bring erstmal entweder Minimum oder Quick zum laufen, nicht ständig beide posten, oder müssen die irgendwie gleichzeitig laufen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G minimumsuche Java Basics - Anfänger-Themen 7
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
P9cman Vokal Zähler mit switch case und for-Schleife Java Basics - Anfänger-Themen 4
R Primzahlen Zähler Programm / Benachbarte Primzahlen Java Basics - Anfänger-Themen 30
M Zähler Java Basics - Anfänger-Themen 3
I Zähler, der erst wieder zählt nachdem Pixel wieder andere Farbe hat Java Basics - Anfänger-Themen 2
K Variablen Zähler Variable in Prozedur Java Basics - Anfänger-Themen 9
F For Schleife ohne Zähler Java Basics - Anfänger-Themen 3
A Ping Pong Score Zähler,aber wie? Java Basics - Anfänger-Themen 3
D Zähler nicht sichtbar (Thema: Konstruktoren) Java Basics - Anfänger-Themen 2
M Variablen Zähler funktioniert nicht - Android App Java Basics - Anfänger-Themen 3
J Zahlensytem-Zähler Java Basics - Anfänger-Themen 1
K JTextField auslesen, in int umwandeln und in einer anderen Klasse als Zähler verwenden Java Basics - Anfänger-Themen 3
R Zähler Java Basics - Anfänger-Themen 9
T Zähler Klasse Java Basics - Anfänger-Themen 4
R Erste Schritte Arbeitszeit Zähler bzw Feierabend Uhr | GregorianCalendar | SimpleDateFormat| Java Basics - Anfänger-Themen 3
L Mausclick Zähler Java Basics - Anfänger-Themen 21
StupidAttack Zähler Java Basics - Anfänger-Themen 5
-horn- Was passiert, wenn Zähler über Integer Max läuft? Java Basics - Anfänger-Themen 9
O Verständnisfrage Zähler/Rekursion Java Basics - Anfänger-Themen 4
D Zähler beim aufrufen des Strings Java Basics - Anfänger-Themen 2
Z klick zähler Java Basics - Anfänger-Themen 2
N Zähler? Java Basics - Anfänger-Themen 3
F Problem, Zähler speichern Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben