sortierverfahren
-
Moin,
ich habe ein kleines Programm in Java verfasst zum sortieren von Zahlen. Kompilieren klappt, ausführen ebenso, jedoch sortiert das Programm nicht richtig. Bei meinen Versuchen hat es zu meist die ersten beiden Zahlen in die richtige Reihenfolge gebracht, den Rest hat es jedoch unberührt gelassen. Hier der Code:
import java.io.*; public class bubblesort { private static boolean rightOrder(int a[]) { boolean rightOrder = false; for (int n = 1; n < (a.length-1); n++) { if (a[n] < a[n+1]) { rightOrder = true; } } return rightOrder; } private static void getActualArray(int a[]) { for (int n = 1; n <= (a.length-1); n++) { System.out.print(a[n] + " "); } System.out.println(); } public static void main(String[] args) { try { int n = 1; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int sizeOfArray = 1; System.out.println("How many numbers shall be sorted?"); sizeOfArray = Integer.parseInt(br.readLine()); int numbers[] = new int[(sizeOfArray+1)]; System.out.println("Please type in the numbers. After each number press Enter!"); for (n = 1; n <= sizeOfArray; n++) { System.out.print("Enter number: "); numbers[n] = Integer.parseInt(br.readLine()); } /*funktioniert*/ getActualArray(numbers); /*funktioniert*/ for (n = 1; !(rightOrder(numbers))/*funktioniert nicht*/; n++) { if (n==sizeOfArray) { getActualArray(numbers); n = 1; }/*funktioniert*/ if (numbers[n] > numbers[n+1]) { numbers[0] = numbers[n+1]; numbers[n+1] = numbers[n]; numbers[n] = numbers[0]; }/*funktioniert*/ } getActualArray(numbers); /*funktioniert*/ } catch(Exception e) { System.out.println("A Exception was thrown!"); } } }
Ich habe das Programm schrittweise untersucht und dementsprechend vermute ich den Fehler bei der Methode rightOrder(...), welche prüft, ob die Zahlen bereits in der richtigen Reihenfolge sind. Der Rest scheint zu funktionieren (die funktionierenden/ nicht funktionierenden Teile habe ich durch entsprechende Kommentare kenntlich gemacht).
Kurze Anmerkung zur theoretischen Funktionsweise (zumindest wie sie sein sollte) des Programms: a(n) wird mit a(n+1) verglichen, wobei das Kleinere an Stelle von a(n) gesetzt wird. Das Verfahren wird wiederholt bis jedes a(n) <= a(n+1)!
Ich könnte mir theoretisch auch vorstellen, dass ich aus Versehen irgendwo C++-Syntax benutzt, die in Java eine andere Bedeutung hat. (nur eine Vermutung, weil ich ursprünglich C++ gelernt habe und mich erst seit etwa 7-8 Wochen mit Java beschäftige)
Schon einmal danke im vor raus!
Gruß Paul!
-
Hallo,
ist richtig, deine rightOrder() methode ist falsch, da das aber nur 3 Zeilen sind, lass ich dich die selbst korrigieren.
Eigentlich poste ich nur um zu sagen dass der Rest vom Code recht schrecklich ist (was soll der Quatsch mit den Arrays ab 1, die absurde for Schleife, "getActualArray").
-
deine rightOrder() methode ist falsch, da das aber nur 3 Zeilen sind, lass ich dich die selbst korrigieren.
Schön, dass du sie mich nochmal durchschauen lassen willst, bringt mir aber nichts, wenn ich gerade "total auf dem Schlauch" stehe. Also bitte eine konkrete Antwort...
Nichts desto trotz guck ich sie mir noch einmal an!was soll der Quatsch mit den Arrays ab 1
Um a(n) mit a(n+1) zu vertauschen (hier in der mathematischen Schreibweise gemeint), brauche ich eine weitere Variabel in der ich einen Wert zwischen speichern kann. Um nicht noch eine neue Variabel zu benutzen, nehme ich die 0te-Stelle des Arrays als Zwischenablage. Ich fand das so übersichtlicher!
die absurde for Schleife, "getActualArray"
Als absurd würde ich sie keinesfalls bezeichnen. Ich fände es eher absurd, hätte ich sie nicht geschrieben! Sie ist dazu da den aktuellen Inhalt des Arrays, also die Zahlen, die sortiert werden sollen, bzw. schon sortiert sind, auszugeben. Ok, aber ich geb zu, dass ich den Namen auch aussagekräftiger hätte wählen können!
-
Deine rightOrder-Schleife ist genau falschherum gedacht.
Schreib mal ein paar unsortierte Zahlen auf ein Stück Papier und dann mache genau das, was in deiner rightOrder-Schleife passiert, dann siehst du den Fehler schnell.
-
Du hast zwei Fehler:
-
die Vergleichsfunktion rightOrder ist falschherum
-
die Sortierschleife wird sofort abbrechen, wenn
2a) Die ersten beiden Zahlen richtig sortiert sind
ab) Zum ersten mal die größte Zahl ans Ende des Arrays gebubbelt wurde
Da BubbleSort eine beliebte Hausaufgabe ist wirst du erst selber noch verbessern müssen, bevor weitere Hilfe kommt. Das ist weder eine Gemeinheit noch persönliche Abneigung sondern soll sicherstellen, dass niemand schummelt - ich glaube fast jeder hier hat einmal im Leben mit seinem ersten BubbleSort gekämpft
Stilfragen:
Arrays beginnen bei 0 und nicht bei 1 <=> Arraygröße = Arraygröße und nicht Arraygröße+1; entsprechende Schleifen starten bei i=0 und enden mit i < array.length oder ähnlich.
Es reicht, den try-catch Block um die Eingabefunktion zu legen, die auch bekannte Exceptions wirft.
Sollten im späteren Code unerwartete Exceptions auftreten (Stichwort Arraygrenzen...) gibt dir Java eine hilfreiche Fehlermeldung; wenn du die Exception aber selbst abfängst wirst du einfach nur "An exception was thrown" sehen.
-