Fragen zu Quellcode QuickSorter

Status
Nicht offen für weitere Antworten.
D

Den_nis

Gast
Moin moin!
Meine Gruppe hat als Auftrag bekommen, ein Quicksort-Algorithmus zu programmieren und da ich derjenige bin, der momentan nichts zu tun hatte, fiel die Aufgabe mir zu. Dachte, dass sei nicht so kompliziert, aber nun ja.
Ich habe dann mal bei euch im Forum, bei google und bei Wikipedia gesucht und bin schlußendlich auf diesen (siehe unten) Quellcode gestoßen, denn ich irgendwie mit einbauen möchte. Ich habe jetzt aber das Problem, dass ich einige Dinge hierbei nicht verstehe und da bisher keine zufriedenstellende Antwort gefunden habe...

1. Was besagt die Zeile this.a=a; - wozu ist dieser Schritt gut.
1.1 Benötige ich das überhaupt, wenn ich mit Array-Labels arbeite, deren Menge bereits durch ein Variable "Anzahl" geregelt ist?
2. Was besagt hinter den beiden While-Schleifen dieses merkwürdige I++ bzw j--
3. n=a.length <- wozu ist das im Quelltext drinne? Ich habe da den Sinn nicht ganz entnehmen können
T'schuldigung falls das dumme Fragen sind, aber wir sind alle nach nicht allzu lange mit Java beschäftigt und haben bisher hauptsächliche theoretische Kenntnisse erlangt (Programmiert haben wir bisher eher Klein-Kram, wie etwa einen Geld-Umrechner). Würde mich trotzdem über Antworten freuen

Code:
public class QuickSorter
{
    private int[] a;
    private int n;

    public void sort(int[] a)
    {
        this.a=a;
        n=a.length;
        quicksort(0, n-1);
    }

    private void quicksort (int lo, int hi)
    {
        int i=lo, j=hi;
        int x=a[(lo+hi)/2];

        //  Aufteilung
        while (i<=j)
        {
            while (a[i]<x) i++;
            while (a[j]>x) j--;
            if (i<=j)
            {
                exchange(i, j);
                i++; j--;
            }
        }

        // Rekursion
        if (lo<j) quicksort(lo, j);
        if (i<hi) quicksort(i, hi);
    }

    private void exchange(int i, int j)
    {
        int t=a[i];
        a[i]=a[j];
        a[j]=t;
    }

}    // end class QuickSorter

Quelle:
http://www.inf.fh-flensburg.de/lang/algorithmen/sortieren/quick/quick.htm
 

dieta

Top Contributor
Das n dient dazu, dass schnelle (eben nur mit "n" anstatt mit "a.length" auf die scheinbar häufiger gebruachte Länge von a zugegriffen werden kann.
Das this.a = a dient dazu, die globale Variable a, auf die über this.a zugegriffen wird, auf den Wert von a, das der Methode übergeben wurde, zu setzen. Das geht nur so, da das übergebene a das globale "überdeckt".
das i++ und j-- bedeutet nur, dass i um eins erhoht bzw. j um eins verringert wird. Man könnte auch schreiben "i = i + 1" und "j = j - 1".
 
D

Den_nis

Gast
Vielen dank,
aber zu dem n -> das kommt doch im weiteen Verlauf gar nicht vor oder habe ich das jetzt was grundlegendes Übersehen (passiert mir öfter, wenn ich schon mehrere Stunde an sowas arbeite)?

Ist dieser Quelltext eigentlich Problemlos in eine Programm mit Arrays, Buttons und vor in eine While-Schleife einzubauen, aber muss ich was bestimmtes beachten?
 

dieta

Top Contributor
Du hast recht, das n kannst du ruhig löschen, wenn du aus dem quicksort(0, n-1); ein quicksort(0, a.length-1); machst.
Die Methoden sollten nicht eigentlich probelmlos in jede bestehende Anwendung integrieren lassen.
 
D

Den_nis

Gast
Vielen Dank,
allerdings habe ich schon das nächste Problem:

Ich möchte versuchen diese Methoden in das Programm zu integrieren, sie sollen aber erst über einen Button gestartet werden. Also habe ich dem Programm gesagt, er solle die im TextField-Array eingegeben Zahlen auf die Label-Arrays übertragen, sobald der Button gedrückt wird. Funktioniert auch. . . dann aber wollte ich einen Methoden-Verweis auf diese Methoden in den Button einbauen. Also mit:
Code:
Methodenname();

unten kommt dann

Code:
public void Methodenname(int[]a)

Das allerdings funktioniert nicht (liegt an dem "int[]a"). Bin da jetzt emsig am rummwuseln im Quelltext, aber wie ich das hinbekommen entzieht sich noch meiner Kenntniss. Würde da gerne noch einmal Hilfe in Anspruch nehmen.
Ist es unmöglich direkt aus einem Button auf eine solche Methode zu leiten oder gibt es da einen Trick?
 

dieta

Top Contributor
Du musst der Methode das Array, das sortiert werden soll, übergeben:
Code:
methodenname(dasArray);
 
D

Den_nis

Gast
Also müsste ich auch beim ersten schon (int[]a) einsetzen? - Das nämlich hatte ich gemacht und es hatte nicht funktioniert, wenn ich mich recht erinnere . . . oder habe ich das jetzt missverstanden?
 

dieta

Top Contributor
Naj... Die methode sort(int[]) erwartet als Argument das Array, das sie sortieren soll.
Das musst du ihr schließlich irgendwie übergeben.
Poste vllt. etwas Code.
 
D

Den_nis

Gast
So sieht mein Programm momentan aus (habe eben nochmal schnell die Methodenübergabe eingefügt)

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class QuicksorterA extends Applet implements ActionListener
{                                                                               //public class Quicksorter beginnt
int max=5;                                                                      //"max" wird als Integer definiert und bekommt den wert 5 zugewiesen
int []a=new int[max];                                                          //Es wird ein Array erzeugt
int c;
String s1, s2;
TextField TF[]=new TextField[max];
Label LA[]=new Label[max];
Button b1=new Button(" Eingabe ");

       public QuicksorterA()                                                    //public QuicksorterA beginnt
       {                                                                        //public Quicksorter beginnt
       setLayout(new GridLayout(max+1,2,1,1));                                  //Layout wird festgelegt (max+1 Zeilen, zwei Spalten)
       for (int i=0; i<max; i=i+1)                                              //For-Schleifenkopf (i ist Integer mit wert 0, wird durchgeführt solange i kleiner als max, jeder Schritt erhöht i um 1
       {                                                                        //For-Schleife beginnt
       TF[i]=new TextField("",8);
       LA[i]=new Label("");
       add(TF[i]);
       add(LA[i]);
       add(b1);
       b1.addActionListener(this);
       }                                                                        //For-Schleife endet
       }                                                                        //public Quicksorter endet
       
       public void actionPerformed(ActionEvent e)
       {                                                                        //public void actionPerf... beginnt
       if(e.getSource()==b1)
       {                                                                        //IF-b1-Definition beginnt
       for (int i=0; i<max; i++)                                                //For-Schleifenkopf (siehe For-Schleife oben)
       {                                                                        //For 1.1 beginnt
       s1=TF[i].getText();
       a[i]=Integer.parseInt(s1);
       LA[i].setText(""+a[i]);
       sort();                                                                  //Methodenübergabe
       }                                                                        //For 1.1 endet
       }                                                                        //IF-b1-Defintion endet
       }                                                                        //public void actionPerf... endet
       public void sort(int [] a]
       {
       //hier soll die die "mir fremde Methode entstehen"
       }


}                                                                               //public class QuicksorterA endet
 
D

Den_nis

Gast
Fantastisch, danke. . .
Das nächste Problem kommt bestimmt, aber erstmal bin ich einen riesigen Schritt weiter glaube ich.

Als nächstes kommt dann der Quicksort-Algorithmus langsam aber sicher da rein. Wenn ich das richtig sehe, muss ich bei dem "fremden Quellcode" noch für die Bildschirm-Ausgabe sorgen und dann die Aufteilung in zwei Felder irgendwie schaffen, damit dort auch wieder ein Quicksort-Algorithmus laufen kann^^ - Aber jetzt bin ich einen riesen Schritt weiter, glaube ich . . . sollten weitere Probleme auftauchen, melde ich mich hier wieder.
 
D

Den_nis

Gast
Ich glaube ich habe langsam echt zu viel in diesem Programm rummgewuselt, denn mittlerweile sehe ich "den Wald vor lauter Bäumen" nicht mehr. . . das Programm (nur die basis, nicht das ganze fertige) läuft, aber es verändert die zahlen . . . . aus 5 - 4 - 3 - 2 - 1 wird immer 1 2 2 3 3 <- ich habe den Quelltext jetzt mehrfach durch, finde aber den Fehler nicht mehr . . . vielleicht irgendwas völlig simples, wonach man sich durch das ewige Programmieren todsuchen kann . . . Ich würde hier gerne nochmals den neuen Quelltext reinsetzen und wäre sehr dankbar, wenn sich jemand vielleicht die Zeit nehmen mag und den Fehler suchen möchte . . . Randnotiz: Keine Informatik-Anfänger auf Zeitddruck an einem QUicksortprogramm arbeiten lassen, wenn diese nicht richtig dafür vorbereitet wurden . . .

Hier nochmal der Code . . . vielleicht einfach im eigenen java-editor einfügen, damit ihr besser sehen könnt, welches Problem sich hier ergibt - wäre für weitere Hilfe echt dankbar

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class QuicksorterA extends Applet implements ActionListener
{                                                                               //public class QuicksorterA beginnt
int max=5;                                                                      //"max" wird als Integer definiert und bekommt den wert 5 zugewiesen
int []a=new int[max];                                                           //Es wird ein Array erzeugt
int c;
private int n;
String s1, s2;
TextField TF[]=new TextField[max];
Label LA[]=new Label[max];
Button b1=new Button(" Eingabe ");

       public QuicksorterA()                                                    //public Quicksorter beginnt
       {                                                                        //public Quicksorter beginnt
       setLayout(new GridLayout(max+1,2,1,1));                                  //Layout wird festgelegt (max+1 Zeilen, zwei Spalten)
       for (int i=0; i<max; i=i+1)                                              //For-Schleifenkopf (i ist Integer mit wert 0, wird durchgeführt solange i kleiner als max, jeder Schritt erhöht i um 1
       {                                                                        //For-Schleife beginnt
       TF[i]=new TextField("",8);
       LA[i]=new Label("");
       add(TF[i]);
       add(LA[i]);
       add(b1);
       b1.addActionListener(this);
       }                                                                        //For-Schleife endet
       }                                                                        //public Quicksorter endet
       
       public void actionPerformed(ActionEvent e)
       {                                                                        //public void actionPerf... beginnt
       if(e.getSource()==b1)
       {                                                                        //IF-b1-Definition beginnt
       for (int i=0; i<max; i++)                                                //For-Schleifenkopf (siehe For-Schleife oben)
       {                                                                        //For 1.1 beginnt
       s1=TF[i].getText();
       a[i]=Integer.parseInt(s1);
       LA[i].setText(""+a[i]);
       sort(a);                                                                 //Methodenübergabe
       }                                                                        //For 1.1 endet
       }                                                                        //IF-b1-Defintion endet
       }                                                                        //public void actionPerf... endet
       public void sort(int [] a)
       {                                                                        //public void sort beginnt
       this.a=a;
       n=a.length;
       quicksort(0, n-1);
       }                                                                        //public void sort endet
       private void quicksort (int y1, int y2)
       {                                                                        //private void quicksort beginnt
       int z1=y1, z2=y2;
       int pivot=a[(y1+y2)/2];
       
           while(z1<=z2)                                                        //Schleifenkopf-While-1
           {                                                                    //While 1 beginnt
           while(a[z1]<pivot) z1++;
           while(a[z2]>pivot) z2--;
           if(z1<=z2)                                                           //IF-Schleifenkopf IF 1
           {                                                                    //IF-1 beginnt
           tausche(z1, z2);
           z1++;
           z2--;
           }                                                                    //IF-1 endet
           }                                                                    //While 1 endet
           
           if (y1<z2) quicksort(y1, z2);
           if (z1<y2) quicksort(z1, y2);
       }                                                                        //private void quicksort endet
       private void tausche(int z1, int z2)
       {                                                                        //private void tausche beginnt
       int k=a[z1];
       a[z1]=a[z2];
       a[z2]=k;
       LA[z1].setText(""+a[z1]);
       LA[z2].setText(""+a[z2]);
       }                                                                        //private void tausche endet

}                                                                               //public class Quicksorter endetA
 
I

Ich nochmal^^

Gast
Bin auf der Fehlersuche einen schritt weitergegekommen:
Es scheint, als würde das Programm zwar alle Zahlen behalten, aber einige rauswerfen und dafür andere doppelt nehmen. Falls das jemandem hilft, mir zu helfen. Ich teste momentan eher dumm rumm, als dass ich das irgendetwas sinnvolles tun würde
 
D

Den_nis

Gast
Das Problem hat sich möglicherweise durch stupides rummprobieren erledigt. Ich hoffe es
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Fragen zu einem Klassendiagramm Java Basics - Anfänger-Themen 8
H Fragen zu Wrapperklassen Java Basics - Anfänger-Themen 29
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
A Bei VierGewinnt fragen ob man gegen CPU oder Menschen spielen will. Java Basics - Anfänger-Themen 7
A Bei VierGewinnt vorher fragen, ob man gegen den Computer spielen möchte oder gegeneinander. Java Basics - Anfänger-Themen 1
A Bei VierGewinnt fragen, ob man gegen den Computer spielen möchte oder gegeneinander Java Basics - Anfänger-Themen 1
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
G Fragen zu Kompelierfehler in Aufgabe. Java Basics - Anfänger-Themen 25
E Bäume/ allgemeine Fragen Java Basics - Anfänger-Themen 21
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
S Diverse Fragen vor Schulaufgabe ;) Java Basics - Anfänger-Themen 4
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
B fragen zu Aufbau eines UML-Klassendiagramm Java Basics - Anfänger-Themen 1
C 3 Fragen rund um Klassenattribute Java Basics - Anfänger-Themen 8
L Erste Schritte Log4J Fragen Java Basics - Anfänger-Themen 5
NeoLexx Fragen zu diversen Elementen der Javabibliothek Java Basics - Anfänger-Themen 5
D Budget Manager fragen zur Umsetzung Java Basics - Anfänger-Themen 9
N Fragen zur Datenspeicherung Java Basics - Anfänger-Themen 45
T Java Anfänger mit konkreten Fragen Java Basics - Anfänger-Themen 2
CT9288 Fragen zu Java Java Basics - Anfänger-Themen 16
W Fragen zu Generics Java Basics - Anfänger-Themen 14
T ObjectInput/OutputStream Fragen zur Funktionsweise Java Basics - Anfänger-Themen 3
J Fragen zu einer Methode Java Basics - Anfänger-Themen 3
J Fragen zum Code aus dem Buch "Schrödinger programmiert Java 2.te Ausgabe" Java Basics - Anfänger-Themen 6
Z Fragen zu Exception (Throws/throw) Java Basics - Anfänger-Themen 7
J Fragen zu Input/Output Java Basics - Anfänger-Themen 3
J Erste Schritte Oracle Tutorials zu Java 8 - Fragen dazu Java Basics - Anfänger-Themen 1
H Java Quereinsteiger Roadmap und Fragen Java Basics - Anfänger-Themen 29
H fragen Java Basics - Anfänger-Themen 15
M Samelsarium Grundlegender Fragen 2 Java Basics - Anfänger-Themen 9
M Sammelsarium an Grundlagen Grundlagen Fragen Java Basics - Anfänger-Themen 11
B Java ist / wird kostenpflichtig. Ein paar Fragen Java Basics - Anfänger-Themen 1
J Fragen zu synrchonized und kritischen Abschnitten Java Basics - Anfänger-Themen 5
S Fragen zu einem Rechentrainer Java Basics - Anfänger-Themen 2
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
J Wo kann man Fragen zu ireport stellen. Java Basics - Anfänger-Themen 0
M Fragen zum Anlegen und Benutzen von Listen Java Basics - Anfänger-Themen 9
G Ein paar Anfänger Fragen zu StdDraw Java Basics - Anfänger-Themen 4
D Fragen zur Klassen Java Basics - Anfänger-Themen 4
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
J Interface Fragen bezüglich "Sauberkeit" von Code Java Basics - Anfänger-Themen 5
D Objekte-Fragen Java Basics - Anfänger-Themen 1
V Erste Schritte Habe Fragen zu der For und While Schleife als auch Inkrement und Dekrement Java Basics - Anfänger-Themen 4
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
Azazel Ein paar Fragen zu Methodenaufrufen(java.awt) Java Basics - Anfänger-Themen 2
S Erste Schritte Fragen zur For-Schleife Java Basics - Anfänger-Themen 9
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
GreenTeaYT Exception und zur OOP fragen? Java Basics - Anfänger-Themen 3
C Fragen zum Spigot Plugin (1.8) Java Basics - Anfänger-Themen 6
J Fragen zu Exceptions Java Basics - Anfänger-Themen 24
N Quiz- Fragen zufällig anzeigen lassen Java Basics - Anfänger-Themen 7
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
L Viele Fragen zu den Grundlagen Java Basics - Anfänger-Themen 5
B Fragen zu ZIP-File Java Basics - Anfänger-Themen 9
L fragen zu arrays Java Basics - Anfänger-Themen 8
L Fragen zu selbstgeschriebenem Programm Java Basics - Anfänger-Themen 5
M Fragen zum Auslesen von HTML Seiten Java Basics - Anfänger-Themen 5
J Threading-Aufgabe. Totale Noob Fragen, aber bitte trotzdem beantworten ;) Java Basics - Anfänger-Themen 7
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
K Erste Schritte Frage Antwort Spiel - Fragen zur Planung Java Basics - Anfänger-Themen 2
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
Anfänger2011 2 kleine Fragen zu ArrayListen Java Basics - Anfänger-Themen 5
S Fragen zu Ausdrücken&Bedingungen Java Basics - Anfänger-Themen 5
A 2 kurze Anfänger fragen Java Basics - Anfänger-Themen 6
H grundlegende Fragen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
N Programm: Fragen beantworten Java Basics - Anfänger-Themen 6
C Anfänger Anfänger Fragen Java Basics - Anfänger-Themen 8
Z Compiler-Fehler LinkedList Fragen Java Basics - Anfänger-Themen 4
D Rekursion Allgemeine Fragen Java Basics - Anfänger-Themen 2
D [Fragen] zu Methoden Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
T Ein paar Fragen zu OOP und Java. Java Basics - Anfänger-Themen 16
J Allgemeine Fragen zur GUI Java Basics - Anfänger-Themen 1
johnnydoe Erste Schritte Erster Blick - erste Fragen Java Basics - Anfänger-Themen 11
DStrohma Grundsätzliche Fragen zu Drag & Drop Java Basics - Anfänger-Themen 1
N Klassen fragen zur getter und setter methode Java Basics - Anfänger-Themen 11
S 3 Fragen, Verzeichnis, GridLayout psoitionieren, Werte für JSpinner Java Basics - Anfänger-Themen 2
T Fragen zu Set / Relationen verknüpfen Java Basics - Anfänger-Themen 4
S 2 Fragen Java Basics - Anfänger-Themen 4
S Hallo und Fragen zu Arbeitsverzeichnis und Menü Java Basics - Anfänger-Themen 8
N Java Fragen... Java Basics - Anfänger-Themen 10
F ExecutorService Fragen! Java Basics - Anfänger-Themen 2
O HashMap Fragen Java Basics - Anfänger-Themen 8
C Fragen zu Arrays Java Basics - Anfänger-Themen 19
T viele "kleine" Fragen... Java Basics - Anfänger-Themen 3
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
S Fragen zu Arrays Java Basics - Anfänger-Themen 6
K Diverse Fragen zum Fehlerlogging Java Basics - Anfänger-Themen 9
N StringReader - Fragen Java Basics - Anfänger-Themen 8
C Einige Fragen zu Frames Java Basics - Anfänger-Themen 7
M Erste Schritte Allgemeine Fragen Java Basics - Anfänger-Themen 4
PaulG Fragen zu Binärbaum Java Basics - Anfänger-Themen 21
P Methoden Aquarium (Fragen zum Scanner) Java Basics - Anfänger-Themen 5
T Erste Schritte Fragen zu meinen kleinen Programm Java Basics - Anfänger-Themen 9
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
O Zwei Fragen zu Methoden Aufrufen Java Basics - Anfänger-Themen 5
B fragen zur for-schleife und arrays Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben