Quicksort Laufzeit langsam

MrXeth

Aktives Mitglied
Hi Leute,
irgendwie ist mein Quicksort- Algorithmus voll langsam:/ kann mir da wer helfen?

Java:
public class Sortieren
{
    // Deklaration Array
    private int []Array;

    /**
     * Konstruktor für Objekte der Klasse Sortieren
     */
    public Sortieren()
    {
        // Array initalisieren mit Zufallslänge
        Array = new int[(int)(Math.random()*10)];
        // Array Zufallszahlen zuweisen
        for(int i= 0; i < Array.length; i++)
        {
            Array[i] = (int)(Math.random()*10);
        }
    }

    /**
     * Konstruktor für Objekte der Klasse Sortieren
     *
     * @param Laenge    Länge des Arrays
     */
    public Sortieren(int Laenge)
    {
        // Array initalisieren mit groeße
        Array = new int[Laenge];
        // Array Zufallszahlen zuweisen
        for(int i= 0; i < Array.length; i++)
        {
            Array[i] = (int)(Math.random()*10);
        }
    }

    /**
     * Main Methode der Klasse Sortieren (Selbstinitialisierung)
     *
     * @param args  Wird vom System benötigt, um Objekt zu konstruieren     
     */
    public static void main(String[] args)
    {
        // Selbstinitialisierung und Programm starten
        (new Sortieren()).start();
    }
    /*
    /**
     * Main Methode der Klasse Sortieren (Mit Hilfsobjekt)
     *
     * @param args  Wird vom System benötigt, um Objekt zu konstruieren     
     */
    /*
    public static void main(String[] args)
    {
    Sortieren s = new Sortieren();
    s.start();
    }
     */  
    /**
     * Methode, die den eigentlichen Programmablauf durchgeht    
     */
    public void start()
    {
        System.out.println("quickSort:");
        System.out.println();
        long startZeit = System.nanoTime(); // Anfangszeit für Laufzeitberechnung
        this.sortieren(Array, 0, Array.length-1);
        System.out.println("Benötigte Zeit zum Sortieren in Nanosekunden: "+(System.nanoTime()-startZeit)+""); //Laufzeitberechnung
        System.out.println();
        this.arrayAusgeben();

        this.neueWerte();

        System.out.println("bubbleSort:");
        System.out.println();
        startZeit = System.nanoTime();
        this.bubbleSort();
        System.out.println("Benötigte Zeit zum Sortieren in Nanosekunden: "+(System.nanoTime()-startZeit)+"");  //Laufzeitberechnung
        System.out.println();
        this.arrayAusgeben();

        this.neueWerte();

        System.out.println("bubbleSort(Rekuriv):");
        System.out.println();
        startZeit = System.nanoTime();
        this.bubbleSortRekursiv();
        System.out.println("Benötigte Zeit zum Sortieren in Nanosekunden: "+(System.nanoTime()-startZeit)+"");  //Laufzeitberechnung
        System.out.println();
        this.arrayAusgeben();

        this.neueWerte();

        System.out.println("selectionSort:");
        System.out.println();
        startZeit = System.nanoTime();
        this.selectionSort();
        System.out.println("Benötigte Zeit zum Sortieren in Nanosekunden: "+(System.nanoTime()-startZeit)+"");  //Laufzeitberechnung
        this.arrayAusgeben();
    }

    /**
     * Methode, um das sortierte Array auszugeben
     */
    private void arrayAusgeben()
    {
        //Array mittels for-Schleife ausgeben
        for(int i = 0; i < Array.length; i++)
        {
            System.out.println("Stelle: "+i+"; Inhalt: "+Array[i]+"");
        }
        System.out.println();
    }

    /**
     * Methode, um den Feldern des Arrays neue Zufallswerte zuzuweisen
     */
    public void neueWerte()
    {
        // Array Zufallszahlen zuweisen
        for(int i= 0; i < Array.length; i++)
        {
            Array[i] = (int)(Math.random()*10);
        }
    }

    /**
     * Methode, um das Array nach dem bubbleSort Algorithmus zu sortieren
     */
    public void bubbleSort()
    {
        // Jedes Feld mit jedem vergleichen
        for(int i = 0; i < Array.length; i++)
        {        
            for(int j = 0; j < Array.length-1; j++)
            {
                // Wenn Array an der Stelle i größer ist, als Array an der Stelle j beide Werte tauschen aufrufen
                if(Array[i] < Array[j])
                {
                    int help = Array[i];
                    Array[i] = Array[j];
                    Array[j] = help;
                }
            }
        }
    }

    /**
     * Methode, um das Array nach dem bubbleSort Algorithmus(rekursiv) zu sortieren
     */
    public void bubbleSortRekursiv()
    {
        // Inhalt des Feldes mit anderen Feldern des Arrays vergleichen
        for(int i = 0; i < Array.length-1; i++)
        {        
            // Wenn Array an der Stelle i größer ist, als Array an der Stelle j beide Werte tauschen und bubbleSort rekursiv aufrufen
            if(Array[i] > Array[i+1])
            {
                int help = Array[i];
                Array[i] = Array[i+1];
                Array[i+1] = help;
                bubbleSort();
            }
        }
    }

    /**
     * Methode, um das Array nach dem selectionSort Algorithmus zu sortieren
     */
    public void selectionSort()
    {
        // an der ersen Stelle bis zum Ende des Arrays hochzählen
        for(int i = 0; i < Array.length-1; i++)
        {
            // ab Stelle i mit den weiterfolgenden Werten vergleichen
            for(int j = i + 1; j < Array.length; j++)
            {
                // wenn der Wert an j kleiner ist als an i, Werte tauschen
                if(Array[j] < Array[i])
                {
                    int help = Array[i];
                    Array[i] = Array[j];
                    Array[j] = help;
                }
            }
        }
    }

    /**
     * Methode um den Quicksort Algorithmus in Gang zu setzen
     */
    public void quickSort()
    {
        // Aufruf der rekursiven Methode sortieren
        sortieren(Array, 0, Array.length-1);
    }

    /**
     * Rekursive Methode zum Sortieren von Arrays
     *
     * @param  Array[]  zu sortierendes Array
     * @param links     linke Stelle des zu sortierenden Raumes des Arrays
     * @param rechts    rechte Stelle des zu sortierenden Raumes des Arrays
     *
     * @return          Array, in dessen linker Hälfte alle Objekte kleiner sind als das "Mittelobjekt" und auf der rechten Seite größer
     */
    private static int[] sortieren(int Array[], int links, int rechts)
    {
     
        // Bedingung prüfen, ob die Stelle links vor rechts ist, ansonsten wird Array wie gehabt zurückgegeben (Abbruchbedingung für die Rekursive Funktion + Überprüfung Zahlendreher/... des Anwenders
        if(links < rechts)
        {
            //Erster Teildurchgang und die Position von dem "Mittelobjekt" wird gespeichert
            int teiler = teile(Array, links, rechts);
            // Funktion wird nochmal durchgegangen
            sortieren(Array, links, teiler);
            // Durchgang für die rechte Seite des Arrays
            sortieren(Array, teiler+1, rechts);
        }
        // Arrayhälfte, bei links alles kleiner ist als das "Mittelobjekt" und rechts alles größer ist, beim finalen Durchgang sortiertes Array
        return Array;
    }

    /**
     * Rekursive Methode zum Sortieren von Arrays
     *
     * @param  Array[]  zu sortierendes Array
     * @param links     linke Stelle des zu sortierenden Raumes des Arrays
     * @param rechts    rechte Stelle des zu sortierenden Raumes des Arrays
     *
     * @return          Position des "Mittelobjektes" oder "Schwenkobjektes" des Arrays
     */
    private static int teile(int Array[], int links, int rechts)
    {
        // Hilfsvariablen erstellen
        int pivot = Array[rechts];  // "Mittelobjekt", welches zur Teilung des Arrays benutzt wird( Links neben ihm kleinere Zahlen, rechts größere)                  
        int i     = links;
        int j     = rechts-1;
        while(i < j) {
            /* // prüfen, an welcher Stelle Zahl ist, für die Bedingung ( Zahl muss kleiner sein als "Mittelobjekt" und innerhalb des Arrays sein( Damit nicht Arrayoutofbounds auftritt))  nicht zutrifft
            for( i = i; Array[i] < pivot && i < rechts-1; i++)
            {
            }
            // prüfen, an welcher Stelle Zahl ist, für die Bediungung ( Zahl muss größer sein als "Mittelobjekt" und innerhalb des Arrays sein( Damit nicht Arrayoutofbounds auftritt))  nicht zutrifft
            for( j = j; Array[j] >= pivot && j > links; j--)
            {
            }*/                                                                                                               // Diese Abfrage funktioniert, ist aber langsam
            // prüfen ob i und j auf der richtigen Seite sind (links: kleiner als pivot, rechts: größer als pivot)
            if(i < j){
                // Werte an Stellen i und j tauschen
                int tauschen = Array[i];
                Array[i] = Array[j];
                Array[j] = tauschen;
                j--;    // Übernimmt das runterzählen von der for Schleife
            }
            else
            {
                i++; // Übernimmt das hochzählen von der for Schleife
            }
        }
        // Da der Pivotwert immer noch ganz rechts ist, prüfen, auf welcher Seite dieser stehen muss (links/rechts)
        if(Array[i] > pivot){
            // Werte an Stellen i und rechts tauschen
            int tauschen      = Array[i];
            Array[i]      = Array[rechts];
            Array[rechts] = tauschen;
        }
        // gibt Position von Pivot zurück, damit dieses nochmal als Teiler verwendet werden kann (Oder halt die Zahl danach)
        return i;
    }
}
 

Meniskusschaden

Top Contributor
Ich würde den Algorithmus erst einmal dazu bringen, überhaupt korrekt zu sortieren. Dann löst sich das Problem mit der Laufzeit vermutlich von selbst. Bei einem so winzigen Array wird man den Vorteil aber wahrscheinlich kaum sehen. bubbleSortRekursiv sieht übrigens auch seltsam aus.
 

Baelact

Mitglied
Hallo,
was den Fehler betrifft: In der Methode
Code:
teile
hast du folgendes geschrieben:
Java:
if(i < j){
    ...
Das aber wird immer wahr sein solange das Programm in der Schleife (
Code:
while(i<j)
) ist.
Diese wäre besser:
Java:
if(Array[i] > Array[j]){
   ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 0
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
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
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
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
A Quicksort, #Vergleiche zählen klappt nicht 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
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
E Alter (Laufzeit) berechnen Java Basics - Anfänger-Themen 11
W Array zur Laufzeit bearbeiten? Java Basics - Anfänger-Themen 31
D Objekterzeugungen mit zur Laufzeit variierenden Attributen Java Basics - Anfänger-Themen 7
J GroupLayout zur Laufzeit erweitern Java Basics - Anfänger-Themen 1
B Übersetzungszeit und Laufzeit Java Basics - Anfänger-Themen 3
amgadalghabra Die vier Sortieralgorithmen die durchschnittliche Laufzeit in Millisekunden Java Basics - Anfänger-Themen 37
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
L Anzahl der Elemente key in einem Array mit log(N) Laufzeit Java Basics - Anfänger-Themen 4
S Interpreter-Fehler Endlosschleife zur Laufzeit aber warum? Java Basics - Anfänger-Themen 15
J JavaFX Label,Button zur Laufzeit Java Basics - Anfänger-Themen 30
H Laufzeit Java Basics - Anfänger-Themen 11
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
L Objekt Typ zur Laufzeit ermitteln Java Basics - Anfänger-Themen 1
J Datei im Package zur Laufzeit editieren Java Basics - Anfänger-Themen 1
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
C Laufzeit von Stack Operation Java Basics - Anfänger-Themen 5
D Laufzeit von einfachem Programm Java Basics - Anfänger-Themen 21
J Laufzeit berechnen/Laufzeitanalyse Java Basics - Anfänger-Themen 2
M Input/Output Datei in Laufzeit-JAR kopieren Java Basics - Anfänger-Themen 6
V Laufzeit Java Basics - Anfänger-Themen 23
G Laufzeit/ O/Θ-Notation einer Treeset Methode Java Basics - Anfänger-Themen 0
W Klassen [GELÖST] Objekte während der Laufzeit mit neuen veränderten Werten beliebig oft initialisieren Java Basics - Anfänger-Themen 2
M Erste Schritte Code zur Laufzeit ändern lassen Java Basics - Anfänger-Themen 3
C Klassen aus einem Package ermitteln und per Laufzeit laden Java Basics - Anfänger-Themen 17
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
M Möglich? Methode aufrufen deren Bezeichner zur Laufzeit durch einen überg. String festgelegt wird Java Basics - Anfänger-Themen 3
K JLabel zur Laufzeit dynamisch erzeugen Java Basics - Anfänger-Themen 7
M Methoden miteinander verbinden (Laufzeit) Java Basics - Anfänger-Themen 6
llabusch Interface Layout eines Labels während der Laufzeit ändern Java Basics - Anfänger-Themen 0
Streeber reale Laufzeit meines Programms ausgeben Java Basics - Anfänger-Themen 1
D Algorithmus zu gegebener Laufzeit implementieren Java Basics - Anfänger-Themen 1
R Variablen Datentyp erst während Laufzeit festlegen Java Basics - Anfänger-Themen 6
S Klassentyp zur Laufzeit ändern? Java Basics - Anfänger-Themen 3
M Laufzeit und O-Notation Java Basics - Anfänger-Themen 3
M Variablen Variable zur Laufzeit erzeugen Java Basics - Anfänger-Themen 3
A Laufzeit von verschachtelter for-Schleife Java Basics - Anfänger-Themen 4
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
L Panels zur Laufzeit ändern Java Basics - Anfänger-Themen 2
A Laufzeit Java Basics - Anfänger-Themen 11
M Methodennamen zur Laufzeit ausgeben Java Basics - Anfänger-Themen 5
F JTable zur laufzeit füllen Java Basics - Anfänger-Themen 7
P GUI - Layout per Laufzeit erstellen/verändern? Java Basics - Anfänger-Themen 6
N Variablen VariableNamen auswirkung auf Laufzeit Java Basics - Anfänger-Themen 3
R Rekursionsformel für Laufzeit von Algorithmus Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben