auch negative Zahlen sotieren

Bitte aktiviere JavaScript!
Was muss ich hier ändern um negative Zahlen korrekt zu sotieren?

Code:
public int[] bubbleSort(int[] a1){
    int i = 1;
  
     
   
      if(a1.length == 0){
       return a1;
       }
    int zwischenschpeicher =0;
    do{
       
        if(a1[i]<a1[--i] ){ i++;
            zwischenschpeicher = a1[i];
            a1[i] = a1[--i];
            a1[i] = zwischenschpeicher;
        }
        i++;
        i++;
    } while(i < a1.length);
   
    return a1;
}
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Das ganze ist eine do while schleife start bei Index 1 und fragt den vorherigen wert ob er größer ist wenn ja vertausche die werte.
Ja das geht auch anderster aber ich soll es mit einer do while schleife schreiben
 
Ich meinte auch nicht die Schleife, sondern die Verwendung der Pre-/Post-Inkrement-Operatoren. Damit das jemand versteht, muss er sich erst einmal damit beschäftigen, in welcher Reihenfolge Java Ausdrücke auswertet.
 
Code:
public int[] bubbleSort(int[] a1){
    int i = 1;
  
     
   
      if(a1.length == 0){
       return a1;
       }
    int zwischenschpeicher =0;
    do{
       
        if(a1[i]<a1[i-1] ){ i+1;
            zwischenschpeicher = a1[i];
            a1[i] = a1[i-1];
            a1[i] = zwischenschpeicher;
        }
       i+1;
       i+1
    } while(i < a1.length);
   
    return a1;
}
Hab ich gerade glernt --i erst abziehen i-- erst nach den durchlauf abziehen :)
 
Das ist etwas völlig anderes: mit den Inkrement-Operatoren wird der Wert der Variablen verändert. Mit der Addition alleine dagegen nicht. Daher sind die Zeilen i+1; völlig sinnfrei.

Und
Java:
            a1[i] = a1[--i];
            a1[i] = zwischenschpeicher;
liefert ein anderes Ergebnis als
Java:
            a1[i] = a1[i-1];
            a1[i] = zwischenschpeicher;
 
Aber es funktioniert ja mit --i nur negative Zahlen nicht
Ah ja:
Java:
import java.util.Random;
import java.util.Arrays;

public class Test {
    private Random rand = new Random(1L);

    public int[] bubbleSort(int[] a1){
        int i = 1;
      
         
       
          if(a1.length == 0){
           return a1;
           }
        int zwischenschpeicher =0;
        do{
           
            if(a1[i]<a1[--i] ){ i++;
                zwischenschpeicher = a1[i];
                a1[i] = a1[--i];
                a1[i] = zwischenschpeicher;
            }
            i++;
            i++;
        } while(i < a1.length);
       
        return a1;
    }

    public boolean perform(int[] expected, int[] data) {
        try {
            int[] actual = bubbleSort(data);
            if (Arrays.equals(expected, actual)) {
                return true;
            }
            System.err.printf("Expected %s but got %s\n", 
                    Arrays.toString(expected), Arrays.toString(actual)); 
        } catch (Exception ex) {
            System.err.printf("Expected %s while sorting %s but got an exception\n",
                    Arrays.toString(expected), Arrays.toString(data));
            ex.printStackTrace();
        }
        return false;
    }
    
    public static void main(String[] args) {
        Test test = new Test();
        int testCases = 10;
        int failures = 0;
        for (int i = 0; i < testCases; i++) {
            int[] data = test.createRandomArray(i);
            int[] expected = new int[data.length];
            System.arraycopy(data, 0, expected, 0, data.length);
            Arrays.sort(expected);
            if (!test.perform(expected, data)) {
                failures++;
            }
        }

        System.out.printf("%d of %d tests failed\n", failures, testCases);
    }

    private int[] createRandomArray(int len) {
        int[] data = new int[len];
        for (int i = 0; i < len; i++) {
            data[i] = rand.nextInt(len);
        }
        return data;
    }
}
 
Was willst Du uns mit dieser Tabelle sagen? Und hast Du den Code aus Kommentar #11 schon mal laufen lassen?
 
Die Tabelle zeigt an was rauskommt Soll was rauskommen soll und ist wie es rauskommt. Ich nutze nur ein vorgefertigten Script also hab nur zugriff auf die Klasse BubbleSort diese bereits ausgetauscht aber nichts besser
 
Ja, weil Dein Code nicht funktioniert und zwar nicht nur bei negativen Zahlen sondern im Allgemeinen.

Schau Dir an, wie Bubblesort funktioniert und schreib den Code neu aber so, dass Du ihn auch verstehst.
 
Was muss ich hier ändern um negative Zahlen korrekt zu sotieren?
Wenn der Code korrekt formuliert ist funktioniert er auch mit negativen Zahlen.
Java:
if(a1[i]<a1[--i] )
Hier wird während des Vergleichs die laufende Variable verändert. Was auf alle Fehler einen Fehler darstellt.

Bring die fehlerhafte Verwendung der Inkrementoperatoren in Deinem Code in Ordnung und die Frage wegen der negativen Zahlen erübrigt sich.
Außerdem benötigt Bubblesort eine doppelte Schleife.
 
Also so massiv, wie du i verringerst und erhöhst würde der Code bei mir durchfallen unabhängig davon, ob er funktioniert oder nicht. Das —i im if machst du nach dem if mit einem i++ sofort rückgängig, aber Dein Tauschen kann nicht funktionieren:
Angenommen i ist 10, dann speicherst du den 10 wert.
Dann wird der 10. Wert zu dem 9ten Wert, i ist danach 9.
Dann schreibst du den gemerkten Wert in den 9. Wert.

Da mich interessiert, wie Dein Lehrer reagiert:
Mach aus der zweiten Zuweisung aus dem i ein ++i, damit machst du das idiotische —i rückgängig...

Dann könnte es funktionieren ....
 
Aber im Ernst: schau Dir an, was —i, ++i, i— und i++ machen.

Oder merke Dir einfach: i++ und i— alleine als reiner increment ist ok, wer sowas aber meint in irgendwelchen Befehlen verwenden zu wollen, der schreibt Code, der unleserlich ist und sehr anfällig für Fehler ist... und wird dann bei sogenannten Coderevisionen entsprechend angegangen....
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben