Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
10.10.11, 16:17
|
#1
|
Anfänger
Registriert seit: Dec 2008
Beiträge: 19
Bedankt: 2
|
[Hilfe] Arrays sortieren mit Bubblesort..
Hey,
Ich habe folgendes Programmiert :
Code:
package sortierenen;
import java.lang.Math;
public class Code {
public void Bubblesort() {
//Zahlenfeld und Zahlen erstellen
int[] Array = new int[5];
for (int i = 0; i < Array.length; i++) {
Array[i] = (int) (Math.random()*10);
System.out.print(+Array[i]+" ");{
System.out.println("");
}
//Sortieren
for (int j=Array.length-1;j>0;j--){
for (int z=0;z<j;z++){
if (Array[i]>Array[i+1]){ // das ist übrigens "at sortierenen.Code.Bubblesort(Code.java:20)"
int temp=Array[i];
Array[i]=Array[i+1];
Array[i+1] = temp;
{
System.out.println(+Array[i]+" ");
}
}
}
}
}
}
}
und die entsprechende Starterklasse
Code:
package sortierenen;
public class Code_Start {
/**
* @param args
*/
public static void main(String[] args) {
Code anw = new Code();
anw.Bubblesort();
}
}
Nun habe ich folgendes Problem:
Das erstellen und füllen des Arrays ist kein Problem, nur das anschliessende sortieren bereitet mir Probleme... Er schmeisst mir 'ne "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5" aus und ich kriege total viele nullen in meiner Konsole ausgegeben und die Zahlen wie wild rumgemixt...
"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at sortierenen.Code.Bubblesort(Code.java:20)
at sortierenen.Code_Start.main(Code_Start.java:11)
5
0
4
0
0
9
0
8
"
Kann bitte mal einer drüber schauen und mir helfen??
Danke!
Lg,
Dijar!
EDIT : Sprache ist Java , in Eclipse geschrieben :P UND es ist wichtig :/
|
|
|
10.10.11, 17:01
|
#2
|
Anfänger
Registriert seit: Dec 2008
Beiträge: 19
Bedankt: 2
|
Ich habe jetzt weiter nochmal etwas dran rumprobiert... :
Code:
package sortierenen;
import java.lang.Math;
public class Code {
public void Bubblesort() {
//Zahlenfeld und Zahlen erstellen
int[] Array = new int[5];
for (int i = 0; i < Array.length; i++) {
Array[i] = (int) (Math.random()*100);
System.out.print("ungeordnet" +Array[i]+" ");
System.out.println("");
}
//Sortieren
for (int j=Array.length-1;j>0;j--){
for (int i=0;i<j;i++){
if (Array[i]>Array[i+1]){
int temp=Array[i];
Array[i]=Array[i+1];
Array[i+1] = temp;
System.out.println(+Array[i]+" ");
}
}
}
}
}
Ich habe eine Klammer falsch gesetzt nach dem füllen des Arrays...
Jetzt sieht meine ausgabe halt wie folgt aus ...
"
ungeordnet12
ungeordnet53
ungeordnet66
ungeordnet41
ungeordnet31
41
31
41
31
31
"
Das Array erstellen klappt also soweit schonmal , nur wie kann ich es änders das die Zahlen auch geordnet rauskommen und sich nicht doppeln wie hier gerade der Fall ist??
|
|
|
10.10.11, 17:01
|
#3
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
ArrayIndexOutOfBoundsException
Das bedeutet, dass du auf eine Feldposition schreiben willst, die nichtmehr existiert.
Edit:
Du erstellst die Zahlen zufällig, da ist es nur natürlich, dass sie doppelt vorkommen.
Oder was genau meinst du?
Edit2:
Ich glaube, ich habe jetzt kapiert was du meinst. 
Hier die Klasse:
Code:
public class code {
public void Bubblesort() {
//Zahlenfeld und Zahlen erstellen
int[] Array = new int[5];
for (int i = 0; i < Array.length; i++) {
Array[i] = (int) (Math.random()*100);
System.out.print("ungeordnet " +Array[i] + "\n");
}
//Sortieren
for (int j = Array.length - 1; j > 0; j--) {
for (int i = 0; i < j; i++){
if (Array[i] > Array[i+1]) {
int temp = Array[i];
Array[i]=Array[i+1];
Array[i+1] = temp;
}
}
}
System.out.print("---------------------\n");
for (int i = 0; i < Array.length; i++) {
System.out.print("geordnet " +Array[i] + "\n");
}
}
}
Dein Sortieralgorythmus stimmt allerdings noch nicht.
Edit3:
Doch er stimmt.
|
|
|
10.10.11, 17:22
|
#4
|
Anfänger
Registriert seit: Dec 2008
Beiträge: 19
Bedankt: 2
|
Erstmal danke für die Antwort..
Ich habe mal mein programm soweit verändert um zu schauen was rauskommt..
Wenn ich das aber richtig sehe , ist das einfach eine zweite Ausgabe des Feldes mit weiteren rnd Werten ... Wie kann ich die Zahlen des ersten Arrays sortiert ausgeben? Bzw. der Sortieralgorythmus ist von meinem Lehrer so übernommen :/
|
|
|
10.10.11, 17:25
|
#5
|
Anfänger
Registriert seit: Dec 2008
Beiträge: 19
Bedankt: 2
|
Ich danke dir vielmals  der Tag ist gerettet *g*
|
|
|
10.10.11, 17:27
|
#6
|
Anfänger
Registriert seit: Dec 2008
Beiträge: 19
Bedankt: 2
|
Sagen wir's so ... Er kann es , er hat aber auch zugegeben das dies nicht die beste Möglichkeit ist aber einer der einfachsten seiner Meinung nach... Ist nur ein allgemeiner Algorythmus als Grundlage für die Klausur
|
|
|
10.10.11, 17:29
|
#7
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
Ja, ich habe mich verguckt.. er stimmt doch sry dafür.
Übernimm einfach mal meine gepostete Klasse, bei mir wird das hier z.B. ausgegeben:
Code:
ungeordnet 46
ungeordnet 1
ungeordnet 88
ungeordnet 31
ungeordnet 37
---------------------
geordnet 1
geordnet 31
geordnet 37
geordnet 46
geordnet 88
Und was hat dein Lehrer denn für eine unsaubere "Programmierhandschrift".
|
|
|
10.10.11, 20:18
|
#8
|
Anfänger
Registriert seit: Jun 2010
Beiträge: 45
Bedankt: 12
|
Code:
import java.lang.Math;
public class Bubblesort
{
public void setList(int a, int b)
{
int[] list = new int[a];
for(int i = 0; i < list.length; i++) list[i] = (int)(Math.random()*b) + 1;
output(list);
list = sort(list);
output(list);
}
public int[] sort(int[] list)
{
for(int i = 0; i < list.length; i++)
for(int j = 1; j < list.length; j++)
if(isBigger(list, j-1, j))
{
int temp = list[j];
list[j] = list[j-1];
list[j-1] = temp;
}
return list;
}
private boolean isBigger(int[] list, int a, int b)
{
if(list[a] > list[b]) return true;
return false;
}
private void output(int[] list)
{
for(int i = 0; i < list.length; i++)
if(i % 25 == 0 && i > 0) System.out.println(list[i] + " ");
else System.out.print(list[i] + " ");
System.out.println();
}
}
Denke daraus kann man einiges rauslesen.
|
|
|
12.10.11, 18:26
|
#9
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
was denn? der bubble-sort von ccursed ist doch völlig ok. ist ja eh nur für didaktische zwecke.
das einzige was mich stört:
Code:
if (boolean_value) return true;
return false;
warum nicht
Code:
if (boolean_value == true) return true;
return false;
???
wie wärs mit
Code:
return (boolean_conditon);
// bzw.
return (list[a] > list[b]);
__________________
entropie erfordert keine wartung
|
|
|
12.10.11, 18:29
|
#10
|
Anfänger
Registriert seit: Jun 2010
Beiträge: 45
Bedankt: 12
|
^Guter Einwand, eigentlich mach ichs mittlerweile immer so, aber hatte es mir ganz am anfang anders angewöhnt
|
|
|
12.10.11, 18:41
|
#11
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
An dieser Stelle würde ich garkeine Funktion implementieren.
Code:
if(isBigger(list, j-1, j))
Bei so einem Einzeiler bringt das nur Ünübersichtlichkeit, nichts weiter.
Warum also nicht einfach
Code:
if (list[j-1] > list[j])
?
|
|
|
12.10.11, 21:30
|
#12
|
Anfänger
Registriert seit: Jun 2010
Beiträge: 45
Bedankt: 12
|
Die Klasse ist exportiert und schnell umgeschrieben aus einem Gerüst für mehrere Sorter, heißt dass die zu sortierende Liste ursprünglich in der gesamten Klasse vorhanden war und somit isBigger() nur mit 2 int Parametern aufgerufen wurde.
Es gab auch noch die Methode swap(int a, int b), welche in der Urklasse vorhanden war und in der die Anweisungen zum Tauschen standen.
Aber: Warum sollte ich, wenn ich 2 Arrays von Integern durchsuche, foreach benutzen ? Dabei gebe ich doch die Kontrolle über die Reihenfolge der Vergleiche ohne Grund komplett ab.
|
|
|
12.10.11, 22:01
|
#13
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
Zitat:
Bei so einem Einzeiler bringt das nur Ünübersichtlichkeit, nichts weiter.
|
nope. wenn man nur bytes numerisch sortiert meinetwegen, aber kann ja sein, daß veryLargeAndComplexWithSophisticatedCompareFunctio nType[] sortiert werden soll. aber bla bla bla ...
wg. der didaktik finde ich es schon sinnvoll eine eigene vergleichsfunktion anzugeben, da diese existentiell fürs sortieren ist.
selbst man 3 qsort
Code:
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
will einen zeiger auf eine solche funktion.
bei einem einfachen if geht das eher unter.
am saubersten wird sortieren noch von funktionalen sprachen beschrieben:
z.b. [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
da kannst du listen(arrays) vom typ a erst sortieren, wenn eine ordnung auf dem typen a existiert. [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
aber hier bin ich wahrscheinlich schon abgeschweift...
wie dem auch sei, auch wenn isBigger() in diesem fall trivial ist, finde ich es in diesem context angebracht.
__________________
entropie erfordert keine wartung
|
|
|
12.10.11, 22:31
|
#14
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
@kanukidz:
Zitat:
Das parsen und casten ist unstabil.
Ui,ui....finde einfach viele Fehler und instabile Fragmente bei so wenig Zeilen...
|
welches parsen und welches casten?
ui,ui... finde einfach viele fehler bei deinen aussagen :P
__________________
entropie erfordert keine wartung
|
|
|
19.10.11, 16:31
|
#15
|
Anfänger
Registriert seit: Dec 2008
Beiträge: 19
Bedankt: 2
|
Ich suche nebenbei nicht umsonst Hilfe... Als Schüler sind meine Codes noch nicht wirklich berauschend :P
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr.
().
|