Quicksort gibt kein Ergebnis aus

Xendarii

Mitglied
Hallo, liebe Java-Forengemeinde 🙂

Ich bin Medieninformatik-Student im zweiten Semester und habe mittlerweile dementsprechend bereits ein Semester Java gehabt. Jetzt ist das Modul Algorithmen dazugekommen, in dem wir als eine Art Hausaufgabe Quicksort programmieren sollen.

Mein Problem ist jetzt, dass ich zwar bereits den Code und auch eine JUnit-Klasse habe, die den Code eigentlich testen sollte, ich im Endeffekt aber keine Ausgabe bekomme. Der Compiler meckert nicht rum, der Code sollte so eigentlich stimmen (außer, ich hab etwas Signifikantes übersehen).

Meine Frage also: Warum kriege ich das sortierte Array nicht zurück? Ich hoffe, ihr könnt mir helfen =)


Hier der Code:

Java:
public class Quicksort {
	
	public static int[] quicksort(int[] array) {
		quickSort(array, 0, array.length - 1);
		return array;
	}
	
	public static void quickSort(int[] zahlen, int links, int rechts) {
		
		int i = links;
		int j = rechts;
		
		if (j > i) {
			
			int pivot = zahlen[zahlen.length / 2];
			
			while (i < j) {
				while (zahlen[i] < pivot && i <= j) {
					i++;
					
				} // zweite while-Schleife
				
				while (zahlen[j] > pivot && i <= j) {
					j--;
					
				} // dritte while-Schleife
				
				if (i < j) {
					austauschen(zahlen, zahlen[i], zahlen[j]);
				} // zweite if-Bedingung
				
			} // erste while-Schleife
			
			austauschen(zahlen, pivot, zahlen[i]);
			
			quickSort(zahlen, links, j - 1);
			quickSort(zahlen, j + 1, rechts);
			
		} // erste if-Bedingung
		
		else {
			return;
		}
		
	} // quicksort
	
	public static void austauschen(int[] array, int stellei, int stellej) {
		
		int temp = stellei;
		stellei = stellej;
		stellej = temp;
		
	} //austauschen
} // Quicksort
 
Zuletzt bearbeitet:
Java:
public static void austauschen(int[] array, int stellei, int stellej) {
        
        int temp = stellei;
        stellei = stellej;
        stellej = temp;
        
    } //austauschen
Dieser Code funktioniert nicht:autsch:

Java unterstüzt "nur" Call-by-value", also können Funktions-Parameter nicht verändert werden, so dass diese ausserhalb der Funktion geänderte Werte haben.
Somit ist nach der Methode
Java:
int[] array = null;
int stellei = 5;
int stellej = 17;
austauschen(array, stellei, stellej);
stellei immer noch 5 und auch stellej immer noch 17.
Zudem greifst Du überhaupt nicht auf das Array zu?
 
Okay - leider haben uns unsere Professoren in der Tat noch nicht erklärt, was der Unterschied zwischen Call-by-Value und Call-by-Reference liegt. Ich hab den Inhalt der Methode austauschen jetzt einfach ausgelagert und dann dementsprechend zweimal in der Methode quickSort stehen - aber passieren tut trotzdem noch nichts. Hast du noch einen Lösungsvorschlag, wie das ganze funktionieren könnte?
 
Dementsprechend dann ja auch...

Java:
int temp = zahlen[i];
zahlen[i] = zahlen[j];
zahlen[j] = temp;

...oder nicht? Damit greife ich doch auf die int-Werte in den Arrays zu?
 
Nochmal der überarbeitete Code.

Ich krieg mittlerweile sogar 'ne Ausgabe, die sieht aber so aus: [I@43f854bd
Kann's ja irgendwie nicht sein...

Java:
public class Quicksort {
	
	public static void main(String[] args) {
		int[] array = {1,8,5,10,23,2,9};
		quickSort(array, 0, array.length - 1);
		System.out.println(array);
	}
	
	public static int[] quickSort(int[] zahlen, int links, int rechts) {
		
		int i = links;
		int j = rechts;
		
		if (j > i) {
			
			int pivot = zahlen[zahlen.length - 1];
			
			while (i < j) {
				while (zahlen[i] < pivot && i < j) {
					i++;
					
				} // zweite while-Schleife
				
				while (zahlen[j] > pivot && i < j) {
					j--;
					
				} // dritte while-Schleife
				
				if (i < j) {
					int temp = zahlen[i];
					zahlen[i] = zahlen[j];
					zahlen[j] = temp;
				} // zweite if-Bedingung
				
			} // erste while-Schleife
			
			int temp2 = pivot;
			pivot = zahlen[i];
			zahlen[i] = temp2;

			quickSort(zahlen, links, j - 1);
			quickSort(zahlen, j + 1, rechts);
			
		} // erste if-Bedingung
		
		return zahlen;
		
	} // quicksort
	
} // Quicksort
 
Du musst die Komponenten des Arrays ausgeben. Das machst du in einer Schleife.

Ich kann dir nur dringend raten, mal das eine oder Java Buch in die Hand zu nehmen.Die Frage ist sehr grundsätzlich.
'Das haben die Professoren mir nicht gesagt' hilft dir im Beruf nicht weiter und ein wenig Interesse und Eigeninitiative muss ohnehin vorhanden sein, sonst kannst du das Studium gleich aufgeben.
 
Zuletzt bearbeitet:
Ich lese gerade das Java-Buch meines Profs, danach kommt das nächste dran, ich zeige da also durchaus Eigeninitiative. Worum es mir geht, ist, dass ich Quicksort bis Dienstag programmiert und kommentiert haben muss und momentan einfach keinen Ansatz habe, wie ich das Programm zum Laufen bringen soll. Dementsprechend wär ich über eine konkrete Hilfestellung sehr glücklich.
 
Das war ein Hinweis, aber ich kann den gerade in meinem Kopf nicht konkret umsetzen (;

An welcher Stelle soll ich die Komponenten des Arrays mit einer Schleife ausgeben?
 
Aye, das ergibt Sinn! Wunderbar, danke! Jetzt krieg ich wenigstens schon einmal ein vernünftiges Ergebnis, das nur leider falsch ist. Das heißt, im Code stimmt auch noch irgendwas nicht...
 
Dann schmeiß etweder den Debugger an oder packe in jede Zeile eine Ausgabe, so dass du nachvollziehen kannst was da schief läuft.
 

Neue Themen


Zurück
Oben