Quicksort, #Vergleiche zählen klappt nicht

Status
Nicht offen für weitere Antworten.

Aticus

Mitglied
Hallo zusammen,

schreibe grade an dem guten alten Quicksort, diesmal für das Sortieren eines eindimensionalen Arrays von Objekten, des Typs Objekte...soweit so gut: schicke Array rein, kommt sortiert raus.
Mein Problem ist, dass ich die Anzahl der Vergleiche der Objekte untereinander zählen möchte.
Als Wert für zB 8 Elemente bekam ich teills 10 Vergleiche zurück...aber da untere Schranke (soweit ich weiß) n*log(n) ist, muss bei mir irgendwo was falsch laufen.
Das Problem tritt bei mir sowohl für eine Random wahl des Pivots als auch für Wahl des mittleren Elements als Pivot auf. Wobei die Werte für Random schlimmer aussehen...was insofern wenig Sinn macht, da es kopierter code mit lediglicher Änderung der Pivot Strategie ist.

Zum zählen habe ich jeweils ausserhalb der Methode einen Counter initialisiert, damit die Rekursion nicht rumfuscht.
Und unmittelbar bevor ein Vergleich kommt, zähle ich hoch, aber i-wie tuts das nicht.
Hoffe ihr könnt mir helfen:
Java:
public class Sorter {
//hier startet quick mit mittlerem Pivot
static int vergleichequickmid=0;
public static int quickmidsort (int UntereGrenze, int ObereGrenze,Objekte[] objektsammlung)
{
int links = UntereGrenze;
int rechts = ObereGrenze;
Objekte Pivotelement = objektsammlung[((UntereGrenze+ObereGrenze) / 2)]; //Pivotstrategie
do
{
while (++vergleichequickmid>-1 && Pivotelement.compareTo(objektsammlung[links])>0) //hier zähle ich mit
links = links + 1 ;
while (++vergleichequickmid>-1 && objektsammlung[rechts].compareTo(Pivotelement)>0) //ebenso hier
rechts = rechts - 1;
if (links <= rechts)
{
//Vertauschen der Elemente
Objekte Merke = objektsammlung[links];
objektsammlung[links] = objektsammlung[rechts];
objektsammlung[rechts] = Merke;
links = links + 1;
rechts = rechts - 1;
}
} while (links <= rechts);
if (UntereGrenze < rechts)
quickmidsort(UntereGrenze, rechts, objektsammlung); //Rekursion
if (links < ObereGrenze)
quickmidsort(links, ObereGrenze, objektsammlung); //Rekursion
return vergleichequickmid;}







//Hier startet es mit randomsort
static int vergleichequickrand=0; //der counter
public static int quickrandsort (int UntereGrenze, int ObereGrenze,Objekte[] objektsammlung)
{
int links = UntereGrenze;
int rechts = ObereGrenze;
Objekte Pivotelement = objektsammlung[UntereGrenze+ rnd.nextInt(ObereGrenze-UntereGrenze)]; //Pivotstrategie
do
{
while (++vergleichequickrand>-1 && Pivotelement.compareTo(objektsammlung[links])>0) //hier zähle ich
links = links + 1 ;
while (++vergleichequickrand>-1 && objektsammlung[rechts].compareTo(Pivotelement)>0)//ebenso wie hier
rechts = rechts - 1;
if (links <= rechts)
{
//Vertauschen der Elemente
Objekte Merke = objektsammlung[links];
objektsammlung[links] = objektsammlung[rechts];
objektsammlung[rechts] = Merke;
links = links + 1;
rechts = rechts - 1;
}
} while (links <= rechts);
if (UntereGrenze < rechts)
quickmidsort(UntereGrenze, rechts, objektsammlung); //Rekursion
if (links < ObereGrenze)
quickmidsort(links, ObereGrenze, objektsammlung); //Rekursion
return vergleichequickrand;}

    private static java.util.Random rnd = new java.util.Random();
}


greetz
Aticus
 
S

SlaterB

Gast
in quickrandsort rufst du rekursiv quickmidsort auf statt wieder quickrandsort ,

auch statische Zählvariable könnte falsch verwendet werden,
am besten getrennte Klassen verwenden, mit jeweils eigenen oder geerbten Variablen/ Methoden,
dann kann das kaum mehr passieren

wie man es hätte herausfinden können:
System.out.println("call qrs: "+vergleichequickrand+", "+UntereGrenze+" - "+ObereGrenze);
zu Beginn von quickrandsort, mehr muss man gar nicht tun,
außer dann zu erkennen 'nur eine Ausgabe? hmm, gibts denn keine Rekursion?'
 

Marco13

Top Contributor
Hab bei einem Test mit 8 (schon sortierten!) Elementen jetzt auch eher so um die 20 Vergleiche raus, aber das kann auch an den Änderungen liegen...
Java:
// Modified from [url]http://www.java-forum.org/java-basics-anfaenger-themen/
92162-quicksort-vergleiche-zaehlen-klappt.html[/url]

class Sorter
{
    public static void main(String args[])
    {
        int n = 8;
        Objekte array[] = new Objekte[n];
        for (int i=0; i<n; i++)
        {
            array[i] = new Objekte(i);
        }

        pivotSelector = new MidPivotSelector();
        System.out.println(quicksort(array));

        pivotSelector = new RandomPivotSelector();
        System.out.println(quicksort(array));


    }

    static int vergleichequick = 0;
    private static java.util.Random rnd = new java.util.Random();
    private static PivotSelector pivotSelector = new MidPivotSelector();

    public static int quicksort(Objekte[] objektsammlung)
    {
        vergleichequick = 0;
        return quicksort(0,objektsammlung.length-1,objektsammlung);
    }
    private static int quicksort(int UntereGrenze, int ObereGrenze,
        Objekte[] objektsammlung)
    {
        int links = UntereGrenze;
        int rechts = ObereGrenze;
        Objekte Pivotelement = pivotSelector.select(
            objektsammlung, UntereGrenze, ObereGrenze); // Pivotstrategie
        do
        {
            while (compare(Pivotelement, objektsammlung[links]) > 0)
                // hier zähle ich mit
                links = links + 1;
            while (compare(objektsammlung[rechts], Pivotelement) > 0)
                // ebenso hier
                rechts = rechts - 1;
            if (links <= rechts)
            {
                // Vertauschen der Elemente
                Objekte Merke = objektsammlung[links];
                objektsammlung[links] = objektsammlung[rechts];
                objektsammlung[rechts] = Merke;
                links = links + 1;
                rechts = rechts - 1;
            }
        }
        while (links <= rechts);
        if (UntereGrenze < rechts)
            quicksort(UntereGrenze, rechts, objektsammlung); // Rekursion
        if (links < ObereGrenze)
            quicksort(links, ObereGrenze, objektsammlung); // Rekursion
        return vergleichequick;
    }

    private static int compare(Objekte a, Objekte b)
    {
        vergleichequick++;
        return a.compareTo(b);
    }



    static class Objekte implements Comparable<Objekte>
    {
        private int n;

        public Objekte(int n)
        {
            this.n = n;
        }

        @Override
        public int compareTo(Objekte o)
        {
            return n-o.n;
        }
    }

    static interface PivotSelector
    {
        <T> T select(T t[], int min, int max);
    }

    static class MidPivotSelector implements PivotSelector
    {
        public <T> T select(T[] t, int min, int max)
        {
            return t[(min+max) / 2];
        }
    }

    static class RandomPivotSelector implements PivotSelector
    {
        public <T> T select(T[] t, int min, int max)
        {
            return t[min+rnd.nextInt(max-min)];
        }
    }

}
 
Zuletzt bearbeitet von einem Moderator:

Aticus

Mitglied
Ich bin mir nach deinem Post nicht ganz sicher, ob ich lachen oder weinen soll. Das Problem in meinem Code lässt sich extrem leicht beheben (*Juche*) aber ich habe diesen dummen Fehler die ganze Zeit übersehen (*schluchz*) ...copy paste halt...

Der static counter nervt im mom wirklich noch etwas, aber das soll nicht deine Sorge sein.

Unterm Strich ganz herzlichen Dank für die schnelle Hilfe!!!

greetz
Aticus

edit:Hey Marco, wollte dich nicht übergehen, wir haben wohl schlichtweg gleichzeitig rumgetippert, auch dir danke für Mühe und Hilfe
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Java Quicksort PAP Java Basics - Anfänger-Themen 2
B Quicksort in Verbindung mit einem Projekt Java Basics - Anfänger-Themen 1
M QuickSort und Liste Java Basics - Anfänger-Themen 6
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
G Quicksort Algorithmus Java Basics - Anfänger-Themen 12
Hanschyo Quicksort sortiert von groß nach klein Java Basics - Anfänger-Themen 3
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
L Quicksort verstehen Java Basics - Anfänger-Themen 3
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 5
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 0
J Quicksort mit Stack Java Basics - Anfänger-Themen 4
Liondary Quicksort Java Basics - Anfänger-Themen 20
K Quicksort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
S Quicksort Algorithmus Java Basics - Anfänger-Themen 2
D Java Quicksort Java Basics - Anfänger-Themen 5
A Frage zu QuickSort Java Basics - Anfänger-Themen 9
B Quicksort mit Durchschnitt als Pivot Java Basics - Anfänger-Themen 1
K Quicksort Java Basics - Anfänger-Themen 3
M Quicksort - Probleme Java Basics - Anfänger-Themen 5
T QuickSort implementieren Java Basics - Anfänger-Themen 5
R QuickSort Verständis Problem (?) Java Basics - Anfänger-Themen 2
M Quicksort implementierung Java Basics - Anfänger-Themen 23
E Quicksort Java Basics - Anfänger-Themen 8
Xendarii Quicksort gibt kein Ergebnis aus Java Basics - Anfänger-Themen 13
E QuickSort: Ergebniss speichern Java Basics - Anfänger-Themen 2
P quickSort eines Objekt-Arrays geht nicht! Java Basics - Anfänger-Themen 11
F Stackoverflow bei Quicksort Java Basics - Anfänger-Themen 2
F Quicksort Java Basics - Anfänger-Themen 22
C Quicksort Invariante Java Basics - Anfänger-Themen 2
C QuickSort - Pivot in der Mitte Java Basics - Anfänger-Themen 5
P QuickSort iterativ Java Basics - Anfänger-Themen 5
K Eine Frage zum Quicksort Java Basics - Anfänger-Themen 11
B Quicksort --> Methodenaufruf Java Basics - Anfänger-Themen 10
B QuickSort - Fehler nicht zu finden Java Basics - Anfänger-Themen 2
W Quicksort Problem Java Basics - Anfänger-Themen 3
J Quicksort Implementierung-- Exception ArrayOutOfBounds Java Basics - Anfänger-Themen 6
M Fehler in meinem Quicksort! Java Basics - Anfänger-Themen 21
B Quicksort Struktogramm Java Basics - Anfänger-Themen 9
G Frage zu Quicksort Java Basics - Anfänger-Themen 18
0 Quicksort bsp Java Basics - Anfänger-Themen 5
B Quicksort Problem Java Basics - Anfänger-Themen 6
S Mein Quicksort Problem: he method quickSort(int[], int, int) Java Basics - Anfänger-Themen 2
M Quicksort Java Basics - Anfänger-Themen 2
C Quicksort raten Java Basics - Anfänger-Themen 2
K ArrayList sortieren mit Quicksort Java Basics - Anfänger-Themen 3
M Quicksort Java Basics - Anfänger-Themen 4
J Quicksort programmieren Probleme Java Basics - Anfänger-Themen 9
S Quicksort Programm Java Basics - Anfänger-Themen 7
D Quicksort Java Basics - Anfänger-Themen 3
K Parameterübergabe bei quickSort Java Basics - Anfänger-Themen 6
S QuickSort will mir nicht in den Kopf (an einer Stelle) Java Basics - Anfänger-Themen 14
0 Quicksort Java Basics - Anfänger-Themen 2
M QuickSort Java Basics - Anfänger-Themen 4
J QuickSort - kurze Frage Java Basics - Anfänger-Themen 9
H Quicksort und Rekursiv: Türme von Hanoi Java Basics - Anfänger-Themen 9
X Erste Schritte Vergleiche Java Basics - Anfänger-Themen 1
W Vergleiche bei generischen Datentypen Java Basics - Anfänger-Themen 7
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
D Wie vergleiche ich zwei BigInteger Werte? Java Basics - Anfänger-Themen 1
N enum vergleiche Klammern? Java Basics - Anfänger-Themen 5
N Vergleiche mit for schleife Java Basics - Anfänger-Themen 2
I String vergleiche mit == Java Basics - Anfänger-Themen 2
D equals Vergleiche Java Basics - Anfänger-Themen 7
R Vergleiche mit Equals(), hashCode() und == Java Basics - Anfänger-Themen 10
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
M Häufigkeit von Wörtern zählen Java Basics - Anfänger-Themen 6
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
S Java Methodenaufrufe zählen Java Basics - Anfänger-Themen 4
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
J Methoden Positive Werte zählen Java Basics - Anfänger-Themen 3
H Buchstaben zählen Java Basics - Anfänger-Themen 9
Poppigescorn Häufigkeit einer zahl zählen Java Basics - Anfänger-Themen 5
HighLife Bestimmte Werte aus Array zählen Java Basics - Anfänger-Themen 15
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
X Game of Life Nachbarn zählen Java Basics - Anfänger-Themen 20
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
S Binärbäume knoten zählen Java Basics - Anfänger-Themen 16
K Counts zählen Java Basics - Anfänger-Themen 23
Kirby.exe Anzahl vorkommender Elemente im Array zählen Java Basics - Anfänger-Themen 9
J Zeichen im String zählen Java Basics - Anfänger-Themen 3
G Binärer Suchbaum Knoten zählen Java Basics - Anfänger-Themen 1
N Zeichen in einem Textfeld zählen und hinterlegen Java Basics - Anfänger-Themen 6
E Knoten eines Baumes unter Bedinung zählen Java Basics - Anfänger-Themen 2
T x Schritte zählen Java Basics - Anfänger-Themen 18
P Schlüsselworte Zählen und Zuweisen von eingelesenen Zahlen Java Basics - Anfänger-Themen 1
A In einem String alle Eigennamen zählen Java Basics - Anfänger-Themen 6
L Baum Knoten zählen Java Basics - Anfänger-Themen 6
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
S Zählen der Zeiger auf Objekte Java Basics - Anfänger-Themen 35
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
B Array - die Häufigkeit der Zahl zählen Java Basics - Anfänger-Themen 9
L Vorherige Objekte zählen und ausgeben Java Basics - Anfänger-Themen 11
L Diphthonge zählen... Java Basics - Anfänger-Themen 5
O ELOPS Zählen Java Basics - Anfänger-Themen 1
S Rekursives Zählen einer Zahl Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben