Bubblesort-Algorithms

Hallo1234

Bekanntes Mitglied
Hallo, die Aufgabe verlangt, dass 10 Zahlen absteigend sortiert werden. Das soll mit Bubblesort geschehen. Allerdings scheitere ich schon bei der Ausgabe der eingegeben Zahlen. Das Ganze sieht dann so aus:
1619349168186.png
Was muss ich verändern, damit mir die Zahlen erst am Ende ausgegeben werden und es dann keine Nullen mehr sind?

Java:
    public static void gibZehnZahlenEin() {
        Scanner s = new Scanner(System.in);
        
        int zahl = 0;
        int[] zehnZahlen = new int[11];
        for(int i=1; i<zehnZahlen.length; i++) {
            System.out.println("Geben Sie die "+i+". Zahl ein: ");
            zahl = s.nextInt();
            int rueckgabe = sortiereZahlen(zehnZahlen, i);
        
        }
        
}
    public static int sortiereZahlen(int[] zehnZahlen, int durchlaeufe) {
        int rueckgabe = 0;
        System.out.println(zehnZahlen[durchlaeufe]);
        return rueckgabe;
    }
 
Hier ist mein Ratschlag immer, dass man so Dinge weiter unterteilt. Dazu bieten sich hier Methoden an:
Du kannst z.B. eine Methode zahlenEingeben erstellen. Dann hast Du übersichtlichen Code a.la.:

Java:
zahlenEingeben(zehnZahlen);
zahlenSortieren(zehnZahlen);
zahlenAusgaben(zehnZahlen);

Dann hast Du eine saubere Unterteilung der Teile und die Chance, dass Du nichts durcheinander wirfst, ist deutlich größer. (Du hast eine Schleife zum Zahlen eingeben und das sortieren kannst/willst Du erst machen, wenn alle Zahlen eingegeben wurden, oder?

Dann noch ein paar Hinweise:
a) Ein Array fängt mit index 0 an. Wenn Du 10 Zahlen speichern willst, dann reicht ein Array der Größe 10 und der Index geht von 0 bis 9.
b) Variablen sollten nach dem Inhalt benannt werden und weniger nach dem Typ. Also statt zehnZahlen einfach nur zahlen. Denn das ist da ja gespeichert. Ob das nun 10 sind oder mehr, ist ja erst einmal irrelevant. Wenn Du sowas später anpassen willst, dann willst Du möglichst wenig Stellen anpassen müssen, daher wäre es unpraktisch, denn dann auch Variablennamen angepasst werden müssten.
 
Ich hätte noch einen Tipp: es wäre vielleicht ganz praktisch, den eingelesenen Wert auch im Array an Position i zu speichern 🙂
 
Java:
package algo;

public class Main2 {

    class Sorts{
        public int[] bubbleSort(int[] array) {
            int n = array.length;
            int temp = 0;
             for(int i=0; i < n; i++){
                     for(int j=1; j < (n-i); j++){
                              if(array[j-1] > array[j]){
                                     //swap elements
                                     temp = array[j-1];
                                     array[j-1] = array[j];
                                     array[j] = temp;
                             }
                     }
             }
            return array;
          
        }
    
    }
}
 
@Joreyk: Es ist bestimmt gut gemeint, fertigen Code zu liefern, aber ich fürchte, dass dies dem TE nicht wirklich weiter hilft. Damit kommt er maximal an einer Abgabe / Hausaufgabe vorbei, aber um so schlimmer wird es dann bei der nächsten Aufgabe, da Grundlagen einfach fehlen.

Daher wäre an der Stelle meine Bitte an Dich, Dich statt dessen auch eher Gedanken zu machen, an was es bei dem TE scheitert um dann an der Stelle einzuhaken und mit Erläuterungen zu helfen.
 
@Joreyk: Es ist bestimmt gut gemeint, fertigen Code zu liefern, aber ich fürchte, dass dies dem TE nicht wirklich weiter hilft. Damit kommt er maximal an einer Abgabe / Hausaufgabe vorbei, aber um so schlimmer wird es dann bei der nächsten Aufgabe, da Grundlagen einfach fehlen.

Daher wäre an der Stelle meine Bitte an Dich, Dich statt dessen auch eher Gedanken zu machen, an was es bei dem TE scheitert um dann an der Stelle einzuhaken und mit Erläuterungen zu helfen.
Sollte ich den Code Löschen
 
Danke für eure Hilfe. Ich habe mir ein Codebeispiel zum Bubblesort-Algorithmus angeschaut und das dann übertragen. Jetzt hängt es nur noch an der Ausgabe. Es soll einmal die originale Zahlenreihe und die sortiere Zahlenreihe ausgegeben werden.
Java:
public static void zahlenEingeben() {
        Scanner s = new Scanner(System.in);

        int zahl = 0;
        int[] zahlen = new int[10];
        for(int i=1; i<zahlen.length+1; i++) {
            System.out.println("Geben Sie die "+i+". Zahl ein: ");
            zahl = s.nextInt();
        }

        int rueckgabe = zahlenSortieren(zahlen);
    }

    public static int zahlenSortieren(int[] zahlen) {
        int rueckgabe = 0;
        int smaller;
        int bigger;
        for(int j=0; j<zahlen.length-1; j++) {
            if(zahlen[j] > zahlen[j + 1]) {
                bigger = zahlen[j];
                smaller = zahlen[j + 1];
                zahlen[j] = smaller;
                zahlen[j + 1] = bigger;
            }
            zahlenAusgeben(zahlen, j);
        }
        return rueckgabe;
    }

    public static void zahlenAusgeben(int[] zahlen, int durchlaeufe) {
        System.out.print(zahlen[durchlaeufe]);
    }
 
nunja man kann doch auch ein Objekt erstellen das ein vorherarray hat und das zahlen Sortieren liefert dir das sortierte zurück
deswegen hatte ich vorher auch mal das int[] als rückgabe wert es sollte ja das sortierte zurück gegeben werden bei dir bleibt rueckgabe immer 0 😉

dann hast du es was ich nicht verstehe ist dass du als "Durchläufe" den Array Index hernimmst die Anzahl deiner Durchläufe ist doch wie oft du die Werte tauschen musst

if ( getauscht)
counter++
 
Java:
SortierKlasse{
    durchläufe
        unsortiertesArray
    methode int[] arraySortieren(int array){
        
    }
    methode getDurchLauefe(){
        
    }
    methode arrayAusgeben(int array){
        
    }
}
so könnte man doch ein Objekt aufbauen man muss ja nicht die ganze Logik in der main machen
 
Es hängt nicht nur an der Ausgabe. Es hängt auch noch an der Eingabe, denn Du speicherst die Zahlen nicht im Array.
Die Schleife bezüglich der Eingabe müsste man dann ggf. bezüglich der Grenzen auch noch anpassen, da es ja bei Index 0 los gehen sollte.

Bezüglich sortieren wäre dann wieder meine Frage, ob Du da nicht etwas vermischt. Denn von einer Methode zahlenSortieren erwarte zumindest ich, dass die Methode Zahlen sortiert. Eine Ausgabe sollte da dann nicht drin sein ...
Dann solltest Du dir das noch einmal genau ansehen. Evtl. erst einmal z.B. mit dem Wikipedia Eintrag zu Bubblesort den Algorithmus verstehen. Oder man mit dem vergleichen, was @Joreyk netter weise schon bereit gestellt hat. (Frag nach bei Verständnisproblemen!)

Bezüglich Ausgabe solltest Du Dir überlegen, was ausgegeben werden soll. Wenn das Array ausgegeben werden soll, dann muss ja nur das Array als Parameter angegeben werden. Dann musst Du nur noch überlegen, wie Du alle Elemente eines Arrays ausgeben kannst.
 
So, jetzt wird mir schon mal die originale Zahlenreihe am Ende ausgegeben. Fehlt nur noch die sortierte Zahlenreihe.
Java:
public static void zahlenEingeben() {
        Scanner s = new Scanner(System.in);

        int[] zahlen = new int[10];
        for(int i=0; i<zahlen.length; i++) {
            System.out.println("Geben Sie die "+(i+1)+". Zahl ein: ");
            zahlen[i] = s.nextInt();
        }
        zahlenSortieren(zahlen);
        
    }

    public static int zahlenSortieren(int[] zahlen) {
        int rueckgabe = 0;
        int smaller;
        int bigger;
        for(int j=0; j<zahlen.length-1; j++) {
            if(zahlen[j] > zahlen[j + 1]) {
                bigger = zahlen[j];
                smaller = zahlen[j + 1];
                zahlen[j] = smaller;
                zahlen[j + 1] = bigger;
            }
            zahlenAusgeben(zahlen, j);
        }
        return rueckgabe;
    }

    public static void zahlenAusgeben(int[] zahlen, int durchlaeufe) {
        System.out.print(zahlen[durchlaeufe]);
    }
 
So, jetzt wird mir schon mal die originale Zahlenreihe am Ende ausgegeben. Fehlt nur noch die sortierte Zahlenreihe.
Java:
public static void zahlenEingeben() {
        Scanner s = new Scanner(System.in);

        int[] zahlen = new int[10];
        for(int i=0; i<zahlen.length; i++) {
            System.out.println("Geben Sie die "+(i+1)+". Zahl ein: ");
            zahlen[i] = s.nextInt();
        }
        zahlenSortieren(zahlen);
       
    }

    public static int zahlenSortieren(int[] zahlen) {
        int rueckgabe = 0;
        int smaller;
        int bigger;
        for(int j=0; j<zahlen.length-1; j++) {
            if(zahlen[j] > zahlen[j + 1]) {
                bigger = zahlen[j];
                smaller = zahlen[j + 1];
                zahlen[j] = smaller;
                zahlen[j + 1] = bigger;
            }
            zahlenAusgeben(zahlen, j);
        }
        return rueckgabe;
    }

    public static void zahlenAusgeben(int[] zahlen, int durchlaeufe) {
        System.out.print(zahlen[durchlaeufe]);
    }
der Rückgabe wert und die zahlen Ausgabe stimmen aber immer noch nicht 😉
 
Den Rückgabewert habe ich geändert:
Java:
public static void zahlenEingeben() {
        Scanner s = new Scanner(System.in);

        int[] zahlen = new int[10];
        for(int i=0; i<zahlen.length; i++) {
            System.out.println("Geben Sie die "+(i+1)+". Zahl ein: ");
            zahlen[i] = s.nextInt();
        }
        zahlenSortieren(zahlen);
        
    }

    public static int[] zahlenSortieren(int[] zahlen) {
    
        int smaller;
        int bigger;
        for(int j=0; j<zahlen.length-1; j++) {
            if(zahlen[j] > zahlen[j + 1]) {
                bigger = zahlen[j];
                smaller = zahlen[j + 1];
                zahlen[j] = smaller;
                zahlen[j + 1] = bigger;
            }
            zahlenAusgeben(zahlen, j);
        }
        return zahlen;
    }

    public static void zahlenAusgeben(int[] zahlen, int durchlaeufe) {
        System.out.print(zahlen[durchlaeufe]);
    }

Was fehlt bei zahlenAusgabe?
 
Den Rückgabewert habe ich geändert:
Java:
public static void zahlenEingeben() {
        Scanner s = new Scanner(System.in);

        int[] zahlen = new int[10];
        for(int i=0; i<zahlen.length; i++) {
            System.out.println("Geben Sie die "+(i+1)+". Zahl ein: ");
            zahlen[i] = s.nextInt();
        }
        zahlenSortieren(zahlen);
       
    }

    public static int[] zahlenSortieren(int[] zahlen) {
   
        int smaller;
        int bigger;
        for(int j=0; j<zahlen.length-1; j++) {
            if(zahlen[j] > zahlen[j + 1]) {
                bigger = zahlen[j];
                smaller = zahlen[j + 1];
                zahlen[j] = smaller;
                zahlen[j + 1] = bigger;
            }
            zahlenAusgeben(zahlen, j);
        }
        return zahlen;
    }

    public static void zahlenAusgeben(int[] zahlen, int durchlaeufe) {
        System.out.print(zahlen[durchlaeufe]);
    }

Was fehlt bei zahlenAusgabe?
es ist unwichtig an welcher stelle der tausch war sondern es ist wichtig wie oft getauscht werden musste um das sortierte array zu haben
 

Zurück
Oben