Wieso geht das nicht & Bubblesort Frage

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Wieso geht das nicht & Bubblesort Frage

	static void printArray(int[] array){
		int i=0;
		String arraystr=new String ("");
		if(i==array.length) System.out.println(arraystr);
		else{
			arraystr+=Integer.toString(array[i]);
			i++;
		}

	}

Bin gerade dabei mal die Übungsblätter alle durchzugehen, aber irgendwie will die Methode nicht ;-(
Fehler wird keiner angezeigt, aber kommen tut auch nichts in der Konsole. Die Funktion aus der Musterlösung funktioniert zwar, aber die bricht nach jeder Zahl um… [edit: ups, die klappt wohl doch]
Ausserdem check ich beim Bubblesort nicht durch. Da gibt es irgendwie tausend Varianten, welche sollen wir denn in der Klausur können? Die mit Boolean Variable oder die mit 2 for-Schleifen?
[edit: hab jetzt beide mal implementiert, die mit der Variable geht 1000x schneller, aber ich glaube da kommt nur bockmist raus]
Ausserdem wird manchmal nur einen Schritt weitergegangen und manchmal zwei.
zB:
493521 => 439521 => 439251 oder 432951?

Fragen über Fragen…

[edit: Und noch eine Frage, wie kann es sein, dass wenn ich mit der Muster-PrintArray-Methode die vier Arrays zum vergleichen untereinander schreiben lasse, die eine unterschiedliche Länge haben? Das wird doch wohl nicht an meinen Algorithmen liegen :smiley: ]


Oh Mann, ich hab jetzt alles mögliche ausprobiert. Ich hab die Algorithmen aus der Musterlösung ausprobiert und welche im Internet gesucht und natürlich welche selbergemacht, aber Selectionsort&Bubblesort wollen einfach nicht. Wieso zB will das hier nicht richtig funktionieren:

	void selection1(int[] array){
		for(int i=array.length-1; i==0; i--){
			int max=0;
			for(int j=1; j<=i; j++)
				if(array[j]>array[max])
					max=j;
			swap(array, i, max);
		}
	}
	
	
	void selection2(int[] array){
		int marker = array.length-1;
		while(marker>=0){
			int max=0;
			for(int i=1; i<=marker; i++)
				if(array[i]>array[max])
				max=i;
			swap(array, marker, max);
			marker--;
		}
	}

Selection1 ist meine Lösung, Selection2 die aus der Musterlösung, aber beide produzieren nur Müll. Sel1 sortiert garnicht und Sel2 nimmt viele Zahlen viel zu oft und lässt dafür andere weg…


selection1 funktioniert nicht, weil die Abbruchbedingung der äußeren for-Schleife falsch formuliert ist. Ansonsten ist die Funktion identisch mit meiner Version (das Array ist bei mir ein Member der Klasse):

	public void SelectionSort()
	{
		for (int i=m_array.length-1; i>=0; i--)
		{
			//größtes Element suchen
			int max = 0;
			for (int j=1; j<=i; j++)
			{
				if (m_array[j] > m_array[max]) max = j;
			}
			
			swap(i, max);
		}
	}

selection2 sieht auf den ersten Blick auch identisch aus, nur daß anstatt der for-Schleife ein while verwendet wurde.


Jetzt bringt Sel1 den gleichen Müll wie Sel2 ;-( Und zwar kommt bei mir das hier raus:
(Die obere Reihe ist sozusagen die Referenz mit InsertionSort, die untere ist was Selection Sort ausspuckt)

0 0 1 1 2 2 3 4 4 7 9 10 11 11 12 12 12 17 18 18 19 21 24 25 25 26 26 
3 3 3 3 21 11 21 21 21 21 11 21 21 21 21 21 21 21 21 21 21 21 21 21 

26 26 27 28 31 31 32 32 32 36 37 37 38 39 39 39 40 41 43 44 44 45 45 
21 21 21 21 25 26 26 26 26 26 26 26 26 27 27 27 27 31 32 32 32 32 37

45 46 47 48 50 50 51 51 53 54 54 56 57 58 59 60 60 62 62 63 65 66 67 
39 41 44 45 45 46 46 48 48 50 51 54 54 56 57 58 59 60 60 60 60 63 63 

67 69 70 76 76 78 79 80 81 82 82 82 84 85 85 86 87 87 88 88 90 90 93 
66 66 67 69 70 76 76 76 78 79 80 82 82 82 84 84 85 86 86 87 87 88 88

94 94 98 99 
90 90 93 94 94 98 99 

Die obere Reihe ist was InsertionSort produziert hat (sieht ja auch ganz gut aus, wenn man mal von den beschissenen Zufallszahlen absieht…) und die untere Reihe hat aber ganz andere Zahlen (obwohl sie auf ein geclontes Array losgelassen wurde) und ausserdem steht oben zB mal eine 11 zwischen den 21igern ;-(
Ich probier jetzt mal deine…

[Edit: Haha! Deine geht auch nicht :slight_smile: Geht sie bei dir denn? Vielleicht liegts am Eclipse oder so, das spackt bei mir eh voll rum und ist mir VIEL zu langsam!

Nimm mal bitte folgende Prozedur zum ausgeben der arrays und vergleiche was mein Selection1Sort (korrigert) im Vergleich zu deiner ausgibt.

	static void printArray (int[] array) {
		for (int i = 0; i < array.length; i++)
		System.out.print (array[i] + " ");
		System.out.println ();
	}

Also bei mir funktioniert’s ohne Probleme…

Kann es vielleicht sein, daß deine swap()-Methode nicht tut, was sie soll?


Sorry für das Bombing, also hier mal mein Gesamtes (mit vielen Teilen aus der Musterlösung…) Ich hoffe mal, dass ich die Swap Methode richtig hab :slight_smile: Da fällt mir ein, es gibt eine Möglichkeit zu swappen OHNE temp Variable. Mit Xor und drei Zeilen Kot, aber das ist eine andere Sache… Also hier mal mein Bockmist:

	
	void swap(int[] array, int index1, int index2){
		int temp = array[index1];
		array[index1]=array[index2];
		array[index2]=array[temp];
	}
	

Edit: Hab den Scheiss mal gekürzt. Klar ist temp ne Variable ich Trottel. Aber manchmal sieht man einfach vor lauter Kot nix mehr.


Versuch mal:

    void swap(int[] array, int index1, int index2){
        int temp = array[index1];
        array[index1]=array[index2];
        array[index2]=temp;   // <-- temp ist kein Array-Index!
    }