MergeSort funktioniert nicht

Status
Nicht offen für weitere Antworten.

raffi

Mitglied
Hallo, ich sitze immernoch an derselben Aufgabe aus diesem Thread:
http://www.java-forum.org/java-basics-anfaenger-themen/85200-adjazenzliste-leer.html

Habe jetzt aber ein Problem mit dem Ordnen des Feldes, in dem die Namen der Orte, 11 Stück, stehen. Das Einlesen-Problem habe ich gelöst, wobei das Feld schon von anfang an kein Problem war. Ich sehe aber bei meinem Quelltext keine Fehler. Feld sieht gefüllt so aus:
Dresden Riesa Döbeln Chemnitz Flöha Olbernhau Bärenstein Aue Schwarzenberg Johangeorgenstadt Zwickau

Meine MergeSort Methoden sind folgende:
Java:
public void mergeSort (Knoten[] staedte, int start, int ende) {
		int mitte;
		if (start < ende) {
			mitte = (start + ende) / 2;
			mergeSort(staedte, start, mitte);
			mergeSort(staedte, mitte+1, ende);
			merge(staedte, start, mitte+1, ende);
		}
	}
	
	public void merge (Knoten[] staedte, int linksPos, int rechtsPos, int rechtsEnde) {
		int linksEnde = rechtsPos - 1;
		int help = linksPos;
		int anz = rechtsEnde - linksPos + 1;
		int i;
		temp = new String[anz];
		while (linksPos <= linksEnde && rechtsPos <= rechtsEnde) {
			if (staedte[linksPos].getStadtname().compareTo(staedte[rechtsPos].getStadtname()) <= 0) {
				temp[help] = staedte[linksPos].getStadtname();
				linksPos++;
				help++;
			}
			else {
				temp[help] = staedte[rechtsPos].getStadtname();
				rechtsPos++;
				help++;
			}
		}
		while (linksPos <= linksEnde) {
			temp[help] = staedte[linksPos].getStadtname();
			linksPos++;
			help++;
		}
		while (rechtsPos <= rechtsEnde) {
			temp[help] = staedte[rechtsPos].getStadtname();
			rechtsPos++;
			help++;
		}
		for (i = 0; i < anz; i++) {
			System.out.println(temp[i]);
		}
	}

aufgerufen durch:
Java:
mergeSort(staedte, 0, staedte.length-1);

Beim Debuggen tritt schon der erste fehler auf, und zwar das anz nur 2 ist. Aber dies müsste doch eigentlich 12 sein, damit auch temp voll gefüllt werden kann!? Und wenn ich diese Länge manuell einsetze funktioniert das ganze zwar reibungslos aber die Ausgabe ist natürlich total falsch:
null
Dresden
null
null
Dresden
null
null
null
null
null
null
null
null
Chemnitz
Dresden
Flöha
null
null
null
null
null

mfg und danke schonmal
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Erstmal vorneweg: Ich gehe davon aus, dass es Teil der Aufgabe ist, das ganze von Hand zu progammieren!? Ansonsten kann man einfach
Arrays.sort(staedte, ...);
aufrufen...

Beim Debuggen tritt schon der erste fehler auf, und zwar das anz nur 2 ist.
Das kann schon sein, da du das vermutlich in der untersten Rekursionsstufe angesehen hast.

Der erste Tipp um das leichter nachvollziehen zu können wären jetzt eingerückte(!) debug-Ausgaben:
Java:
public void mergeSort (Knoten[] staedte, int start, int ende, String intent) 
{
    System.out.println(indent+"mergeSort von "+start+" bis "+ende+" auf "+Arrays.toString(staedte));

        int mitte;
        if (start < ende) {
            mitte = (start + ende) / 2;
            mergeSort(staedte, start, mitte, indent+"    ");
            mergeSort(staedte, mitte+1, ende, indent+"    ");
            merge(staedte, start, mitte+1, ende, indent+"    ");
        }
    }
    
    public void merge (Knoten[] staedte, int linksPos, int rechtsPos, int rechtsEnde, String indent) 
    {
        System.out.println(indent+"merge von "+linksPos+" bis "+rechtsPos+" ende "+rechtsEnde+" auf "+Arrays.toString(staedte));
        ....


        ...
        System.out.println(indent+"merge von "+linksPos+" bis "+rechtsPos+" ende "+rechtsEnde+" ergibt "+Arrays.toString(staedte));
    }
 

raffi

Mitglied
Hallo, ja es soll natürlich per Hand programmiert werden...
Also ich habs mal noch etwas abgeändert und mir nochmal die debugging Schritte angeschaut. Er fängt eigentlich ganz gut an, aber eine Zählvariable springt dann drüber hinaus. Erstmal der leicht abgeänderte Quelltext:
Java:
public void mergeSort_aufruf(Knoten[] staedte) {
        String[] temp = new String[staedte.length];
        mergeSort(staedte, 0, staedte.length - 1, temp);
    }
	
	public void mergeSort (Knoten[] staedte, int start, int ende, String[] temp) {
		int mitte;
		if (start < ende) {
			mitte = (start + ende) / 2;
			mergeSort(staedte, start, mitte, temp);
			mergeSort(staedte, mitte+1, ende, temp);
			merge(staedte, start, mitte+1, ende, temp);
		}
	}
	
	public String[] merge (Knoten[] staedte, int linksPos, int rechtsPos, int rechtsEnde, String[] temp) {
		int linksEnde = rechtsPos - 1;
		int help = linksPos;
		while (linksPos <= linksEnde && rechtsPos <= rechtsEnde) {
			if (staedte[linksPos].getStadtname().compareTo(staedte[rechtsPos].getStadtname()) <= 0) {
				temp[help] = staedte[linksPos].getStadtname();
				linksPos++;
				help++;
			}
			else {
				temp[help] = staedte[rechtsPos].getStadtname();
				rechtsPos++;
				help++;
			}
		}
		while (linksPos <= linksEnde) {
			temp[help] = staedte[linksPos].getStadtname();
			linksPos++;
			help++;
		}
		while (rechtsPos <= rechtsEnde) {
			temp[help] = staedte[rechtsPos].getStadtname();
			rechtsPos++;
			help++;
		}
		return temp;

Ausgabe erscheint zwar komisch, aber ich habe mal noch das "Arrays.toString(staedte)"
durch "staedte.toString()" ersetzt, das sieht nicht ganz so grausam aus. Ausgabe ergibt folgendes:
mergeSort von 0 bis 11 auf [LKnoten;@1242719c
mergeSort von 0 bis 5 auf [LKnoten;@1242719c
mergeSort von 0 bis 2 auf [LKnoten;@1242719c
mergeSort von 0 bis 1 auf [LKnoten;@1242719c
mergeSort von 0 bis 0 auf [LKnoten;@1242719c
mergeSort von 1 bis 1 auf [LKnoten;@1242719c
merge von 0 bis 1 ende 1 auf [LKnoten;@1242719c merge von 1 bis 2 ende 1 ergibt [LKnoten;@1242719c
mergeSort von 2 bis 2 auf [LKnoten;@1242719c
merge von 0 bis 2 ende 2 auf [LKnoten;@1242719c merge von 2 bis 3 ende 2 ergibt [LKnoten;@1242719c
mergeSort von 3 bis 5 auf [LKnoten;@1242719c
mergeSort von 3 bis 4 auf [LKnoten;@1242719c
mergeSort von 3 bis 3 auf [LKnoten;@1242719c
mergeSort von 4 bis 4 auf [LKnoten;@1242719c
merge von 3 bis 4 ende 4 auf [LKnoten;@1242719c merge von 4 bis 5 ende 4 ergibt [LKnoten;@1242719c
mergeSort von 5 bis 5 auf [LKnoten;@1242719c
merge von 3 bis 5 ende 5 auf [LKnoten;@1242719c merge von 5 bis 6 ende 5 ergibt [LKnoten;@1242719c
merge von 0 bis 3 ende 5 auf [LKnoten;@1242719c merge von 3 bis 6 ende 5 ergibt [LKnoten;@1242719c
mergeSort von 6 bis 11 auf [LKnoten;@1242719c
mergeSort von 6 bis 8 auf [LKnoten;@1242719c
mergeSort von 6 bis 7 auf [LKnoten;@1242719c
mergeSort von 6 bis 6 auf [LKnoten;@1242719c
mergeSort von 7 bis 7 auf [LKnoten;@1242719c
merge von 6 bis 7 ende 7 auf [LKnoten;@1242719c merge von 7 bis 8 ende 7 ergibt [LKnoten;@1242719c
mergeSort von 8 bis 8 auf [LKnoten;@1242719c
merge von 6 bis 8 ende 8 auf [LKnoten;@1242719c merge von 8 bis 9 ende 8 ergibt [LKnoten;@1242719c
mergeSort von 9 bis 11 auf [LKnoten;@1242719c
mergeSort von 9 bis 10 auf [LKnoten;@1242719c
mergeSort von 9 bis 9 auf [LKnoten;@1242719c
mergeSort von 10 bis 10 auf [LKnoten;@1242719c
merge von 9 bis 10 ende 10 auf [LKnoten;@1242719c merge von 10 bis 11 ende 10 ergibt [LKnoten;@1242719c
mergeSort von 11 bis 11 auf [LKnoten;@1242719c
merge von 9 bis 11 ende 11 auf [LKnoten;@1242719cException in thread "main" java.lang.NullPointerException
at Graph.merge(Graph.java:89)
at Graph.mergeSort(Graph.java:79)
at Graph.mergeSort(Graph.java:78)
at Graph.mergeSort(Graph.java:78)
at Graph.mergeSort_aufruf(Graph.java:69)
at Graph.einlesen(Graph.java:173)
at Graph.main(Graph.java:182)

Und wenn ich das Feld temp mal wie am Anfang nach jedem Schritt anzeigen lasse sieht es folgendermaßen aus:
Dresden | Riesa | null | null | null | null | null | null | null | null | null | null |
Dresden | Döbeln | Riesa | null | null | null | null | null | null | null | null | null |
Dresden | Döbeln | Riesa | Chemnitz | Flöha | null | null | null | null | null | null | null |
Dresden | Döbeln | Riesa | Chemnitz | Flöha | Olbernhau | null | null | null | null | null | null |
Chemnitz | Dresden | Flöha | Olbernhau | Riesa | Döbeln | null | null | null | null | null | null |
Chemnitz | Dresden | Flöha | Olbernhau | Riesa | Döbeln | Aue | Bärenstein | null | null | null | null |
Chemnitz | Dresden | Flöha | Olbernhau | Riesa | Döbeln | Bärenstein | Aue | Schwarzenberg | null | null | null |
Chemnitz | Dresden | Flöha | Olbernhau | Riesa | Döbeln | Bärenstein | Aue | Schwarzenberg | Johangeorgenstadt | Zwickau | null |

Und danach komt die NullPointerException. Aber bis dahin läuft das eigentlich ganz gut.

danke
 

Marco13

Top Contributor
Und danach komt die NullPointerException. Aber bis dahin läuft das eigentlich ganz gut.

Das ist wie bei dem Kerl, der aus dem 10. Stock fällt, und sich nach 9 Stockwerken denkt: "Och, bis jetzt war's gar nicht so schlimm..." ;)

Die Ausagbe der Arrays ist zwar blöd um sie hier zu posten, aber könnte ja (wenn sie in der Console stehen) helfen, nachzuvollziehen, wo der Fehler liegt - also wo er auf 'null'-Einträge zugreift - der Fehler tritt ja in "Graph.merge(Graph.java:89)" auf, d.h. dort könntest du mal schauen, was dort null ist - und dann versuchen, nachzuvollziehen, warum es null ist. Evtl. hilft es auch, das ganze mit einem Array mit 4 oder 5 Städten zu testen - falls der Fehler dann auch noch auftritt.
 

nemo86

Mitglied
vielleicht hilft das:

Code:
/**
 * MergeSort-Implementierung. Angelehnt an die Implementierung in der 
 * Java-Standardbibliothek.
 */
public class MergeSort {
	
	public static void sort(int[] seq, int from, int to) {
		int[] aux = new int[to-from];
		System.arraycopy(seq, from, aux, 0, to-from);
		mergeSort(aux, seq, from, to, from);
	
	}
	
	private static void mergeSort(int[] src, int[] dest, int low, int high, int offset) {
		
		int length = high - low;
		if (length <= 1) return;
				
		
		int destLow = low;
				
		low -= offset;
		high -= offset;
		int mid = (low + high) >>> 1;
		
		mergeSort(dest, src, low, mid, -offset);
		mergeSort(dest, src, mid, high, -offset);
		
				
		// merge
		for(int k = 0, i = low, j = mid; k < length; ++k) {
			if (i >= mid || (j < high && src[j] < src[i])) {
				dest[destLow+k] = src[j++];
			} else {
				dest[destLow+k] = src[i++];
			}
		}
		
	}
}
 

vogella

Bekanntes Mitglied
Hallo raffi,

hier findest Du auch ein Beispiel für Mergesort Mergesort in Java

Der Artikel beinhaltet auch einen JUnit Test; wenn Du JUnit nicht kennst, kannst Du das einfach auf eine main Methode umschreieben.


Was ich Dir empfehlen kann

1.) Nutze die Implementierung von nemo86 oder von dem Artikel
2.) Nutze einen Test (JUnit oder main Method) , um die int Implmentierung zu testen ->-> dann kannst Du schon mal sicher sein ints sortieren zu können
3.) Paßt Deinen String sortierer basiered auf 1.) an
4.) schreibt Dir einen Test (JUnit oder main method) für Strings
5.) Paßt den int Sortierer an bis Dein Test durchläuft
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Devin Mergesort verstehen Allgemeine Java-Themen 3
Kirby.exe K-Way MergeSort Allgemeine Java-Themen 33
L MergeSort allgemein Allgemeine Java-Themen 61
J Rekursion Mergesort Allgemeine Java-Themen 10
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
X MergeSort Laufzeit Problem Allgemeine Java-Themen 4
T Threads Mergesort mit limitierter Threadanzahl Allgemeine Java-Themen 2
S MergeSort iterativ und rekursiv? Allgemeine Java-Themen 8
B Generische Datentypen MergeSort Allgemeine Java-Themen 5
B Hilfe beim Verständnis von Mergesort Allgemeine Java-Themen 5
D MergeSort Allgemeine Java-Themen 19
H [LinkedList] Sortieren durch MergeSort Allgemeine Java-Themen 3
N externes Sortieren (MergeSort Allgemeine Java-Themen 2
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
Lukas2904 Wie funktioniert ein KeyLogger? Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
I Wieso funktioniert das nich? Allgemeine Java-Themen 5
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
A Mp3 Player funktioniert nicht Allgemeine Java-Themen 0
X JNA funktioniert nicht mehr Allgemeine Java-Themen 4
bueseb84 FolderWatcher mit WatchService funktioniert nur bedingt Allgemeine Java-Themen 5
Drachenbauer Division mit Int funktioniert nicht Allgemeine Java-Themen 3
O docx-Datei erzeugung mit DocXStamper funktioniert nicht Allgemeine Java-Themen 2
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Tesseract-OCR 4.0 unter Linux funktioniert nicht Allgemeine Java-Themen 3
J Wie konkret funktioniert das Modulsystem unter Java 11? Allgemeine Java-Themen 4
J Neuronales Netz funktioniert mal und mal nicht. Allgemeine Java-Themen 3
T Umlaute in Eclipse einlesen funktioniert nicht Allgemeine Java-Themen 16
A Methodenaufruf funktioniert nicht richtig Allgemeine Java-Themen 5
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
J FTPSClient funktioniert nicht Allgemeine Java-Themen 4
H IDEA IntelliJ Java Mail funktioniert nach Export nicht mehr! Allgemeine Java-Themen 1
M Operatoren Warum funktioniert diese überprüfung nicht? Allgemeine Java-Themen 7
R jar-Datei funktioniert nicht Allgemeine Java-Themen 2
E Open Declaration Funktioniert nicht Allgemeine Java-Themen 0
R Verschlüsselung funktioniert nicht Allgemeine Java-Themen 5
RalleYTN requires transitive funktioniert nicht? Allgemeine Java-Themen 7
R Bruteforce hashes mit multithreading. Funktioniert das so? Allgemeine Java-Themen 0
P Best Practice Wieso funktioniert der Modulo - Operator nicht? Allgemeine Java-Themen 2
HarleyDavidson Eigener PropertyChangeListener funktioniert einfach nicht Allgemeine Java-Themen 3
J Exclude funktioniert nicht Allgemeine Java-Themen 2
K .jar funktioniert nicht vollständig Allgemeine Java-Themen 1
P Java https proxy (-Dhttps.proxyHost) Start-Parameter funktioniert nicht? Allgemeine Java-Themen 2
L Auswertung eines Testes funktioniert nicht Allgemeine Java-Themen 37
O Fahrenheit/Celsius Converter funktioniert nicht Allgemeine Java-Themen 2
M Serialisierung funktioniert nicht Allgemeine Java-Themen 9
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
J Arrays auf gleichheit untersuchen funktioniert nicht Allgemeine Java-Themen 11
P GUI: ArrayList anzeigen funktioniert nicht Allgemeine Java-Themen 5
H Timer funktioniert nicht? Allgemeine Java-Themen 3
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
J If Abfrage funktioniert nicht Allgemeine Java-Themen 4
R Objekt funktioniert nicht auf iOS Allgemeine Java-Themen 15
U PersistenceManager.createEntityManager funktioniert nicht Allgemeine Java-Themen 3
D Java Datei nach Eclipse Export funktioniert nicht Allgemeine Java-Themen 0
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
JG12111989 Auswertung von Fragebogen funktioniert nicht! Allgemeine Java-Themen 7
M Primzahlberechnung funktioniert nicht. Allgemeine Java-Themen 4
A JFreeChart funktioniert nicht :( Allgemeine Java-Themen 6
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
F Datei einlesen funktioniert nicht Allgemeine Java-Themen 3
A Debugger im Java-Editor funktioniert nicht Allgemeine Java-Themen 5
B DB-Zugriff einer Webanwendung funktioniert nicht mit Java 7 Allgemeine Java-Themen 2
B Web-Anwendung funktioniert mit Java 1.8, aber nicht mit Java 1.7 (auf Client) Allgemeine Java-Themen 5
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10
F JTextField funktioniert nicht Allgemeine Java-Themen 6
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
S CSV Eintrag der nächsten Zeile auslesen funktioniert nicht Allgemeine Java-Themen 8
S Command funktioniert in Kommandzeile aber nicht mit ProcessBuilder bzw. Runtime.exec auf MAC Allgemeine Java-Themen 3
G Verschlüsselungsalgorythmus funktioniert nicht Allgemeine Java-Themen 2
buggy84 Ausführen einer Batch mit Parameterübergabe funktioniert nicht richtig Allgemeine Java-Themen 18
G Befehl funktioniert in Eclipse allerdings nicht in einer Jar-Datei Allgemeine Java-Themen 3
N Werte aus Arrays auslesen funktioniert nicht Allgemeine Java-Themen 5
W getResources funktioniert nur in Eclipse, nicht in JAR Allgemeine Java-Themen 2
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
M exec() funktioniert nicht Allgemeine Java-Themen 1
M RC4-Chiffre (funktioniert eingeschränkt) Allgemeine Java-Themen 6
X Datentypen Dropzone.options funktioniert nicht Allgemeine Java-Themen 1
D Java funktioniert nur mit deaktivierter Grafikkarte Allgemeine Java-Themen 3
L Erste Schritte Eclipse und Lokal funktioniert - in HTML nicht! Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben