Sortierverfahren - allgemeine Lösung?

clemensum

Mitglied
Hallo allerseits! :)

Es geht darum, dass ich eine Liste an Elementen der Größe nach sortiert werden muss. Dabei DARF KEINE fertige Routine der Java-Bibliothek entnommen werden und muss eigenständig implementiert werden.

Dabei habe ich mir überlegt, dass ich ja zwei benachbarte Elemente jeweils vertauschen kann und zwar solange bis das (k+1)-te Element größer als k-tes Element FÜR ALLE k<=liste.length.

Mein Java-Code lautet:

Java:
import java.util.Arrays;

public class Sortieralgorithmus {

	// static double sortieren(int[] array ) {

	public static void main(String[] args) {
		int i = 0;
		int[] array = { 5, 7, 3, 2, 4, 6, 9, 8, 1 };
		int[] hilfsarray = new int[array.length];

		while (i < array.length) {
			hilfsarray[i] = array[i];
			i++;
		}

		while (array[i + 1] < array[i] ||??????????) {
			while (i < array.length - 1) {
				if (array[i] > array[i + 1]) {
					vertausche(array[i], array[i + 1]);
				}

				i++;
			}
			i = 0;
		}

		System.out.println(Arrays.toString(array));

	}

}

Das Problem:
Ich rätsle schon seit geraumer Zeit welche Bedingung ich der der äußersten Schleife füttern soll.
Ich weiß nicht, wie ich beibringen kann, dass er erkennen kann, wenn die Liste fertig sortiert ist. Ich nehme an, dass er ungünstigerweise so viele Fälle durchlaufen muss, wie es das Worst-Case Szenario offenbart. Gibt es eine Optimierung? Wie lautet hier überhaupt der Worst-Case? Ich nehme an, dieser liegt (genau) dann vor, wenn die Elemente in umgekehrter Reihenfolge darliegen. Also müsste ich die Anzahl der Schritte dafür überlegen und dies als Bedingung formulieren.

Meine Frage aber: Wie kann ich mir dies allgemein überlegen, etwa, wenn das Array mit Zufallszahlen gefüllt ist, Wie viele Schritte sind dann nötig, bis die Liste in eine geordneten Reihenfolge gebracht wird? :rtfm:
 

Andi_CH

Top Contributor
Mal abgesehen davon, dass deine "vertausche" Mothode wohl nicht funktionieren wird (call by reference vs call by value) habe ich gar nicht zu verstehen versucht was dein Code soll (dazu ist es zu heiss)

Effizient kannst du selbst noch einbauen und die Exception die es gibt ist willentlich drin ... na ja irgend etwas sollst du ja auch noch zu tun haben :D

Java:
import java.util.Arrays;

public class PrimitvSort {

	public static void main(String[] args) {
		int[] array = { 5, 7, 3, 2, 4, 6, 9, 8, 1 };
		boolean etwasVertauscht;
		System.out.println(Arrays.toString(array));
		do {
			etwasVertauscht = false;
			for(int i=0; i<array.length; i++) {
				if(array[i]>array[i+1]) {
					etwasVertauscht = true;
					int tmp = array[i+1];
					array[i+1] = array[i];
					array[i] = tmp;
					System.out.println(Arrays.toString(array));
				}
			}
		} while (etwasVertauscht);
		System.out.println("============== fertig ==============");
		System.out.println(Arrays.toString(array));
	}
}
 

clemensum

Mitglied
UUps, ich sehe, da hat mir Jemand einen Code angeboten - jetzt bin ich Gott sei Dank auch selbst auf die Lösung des Grundkonzeptes gekommen :)
Java:
import java.util.Arrays;

public class Sortieralgorithmus {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = { 5,4,3,2,1};
		int[] hilfsarray = new int[100];
		int i = 0, j = 0;

		while (j < array.length) {
			if (array[j + 1] < array[j]) {
				hilfsarray[j] = array[j];
				hilfsarray[j + 1] = array[j + 1];
				array[j] = hilfsarray[j + 1];
				array[j + 1] = hilfsarray[j];
				
			}
		i++;
			if ((i == ((array.length)* (array.length -1 )) / 2 +10))
				break;	
			
			
			j++;

			if (j == array.length -1 )
				j = 0;
		

		}

		System.out.println(Arrays.toString(array));
	}

}

So, jetzt muss ich Wörter "ihrer Größe" nach sortieren. Da ich aber keine Methoden der API verwenden darf, bin ich ratlos wie ich das angehen soll.

Man darf ja nicht so etwas schreiben wie:
if(Hansi>Affe)

Gibt es eine Möglichkeit, strings nach ihrer (d.h. alphabetisch)Größe zu vergleichen ??
Gibt es da einen speziellen Befehl. (Ich meine aber ohne implements comparable) :rtfm:
 
S

SlaterB

Gast
Strings haben eine compareTo()-Methode,
das hast schon was mit Comparable zu tun, wieso das nicht? neu implementieren musst du zum Glück eher nicht
 

bLaSt

Aktives Mitglied
Strings haben eine compareTo()-Methode,
das hast schon was mit Comparable zu tun, wieso das nicht? neu implementieren musst du zum Glück eher nicht

Hinzu zu fügen ist vielleicht noch was die compareTo()-Methode zurückgibt.
Sie gibt dir -1, 0, 1 zurück.
Das heißt für deine if-Anweisung nicht anderes wie, dass wenn du -1 zurück bekommst ist der Wert kleiner als der mit dem du in verglichen hast und bei 1 ist er größer und bei 0 ist es der gleiche Wert ;)
Ansonsten gibt es da noch die Collator Klasse. Da kann man sogar Landestypische Rechtschreibungen mit importieren
 

clemensum

Mitglied
Das Problem ist eben, dass man nicht "implements Comparable" verwenden soll.

Aso, wenn ich das jetzt nicht mehr neu implementieren muss, dann reicht es doch aus, einfach ein String-Array anstatt eines int-Arrays zu verwenden??

Aber wie kann ich dann vergleichen? Da muss sich wohl mein Lehrer geirrt haben. oder?? ???:L
 
S

SlaterB

Gast
- du schreibst nirgendwo in dein Programm 'implements Comparable',
- du verwendest String[] statt int[]
- du verwendest compareTo() statt <

diese Kombination haut mehr oder weniger hin, ok für dich?
wenn es dich glücklicher macht kannst du die Methode auch selber implementieren, vielleicht unter anderen Namen,
um Strings zu vergleichen muss man die chars paarweise anschauen, bei chars gibts dann auch wieder <,
der Originalcode lautet
Java:
   public int compareTo(String anotherString) {
	int len1 = count;
	int len2 = anotherString.count;
	int n = Math.min(len1, len2);
	char v1[] = value; // toCharArray()
	char v2[] = anotherString.value; // toCharArray()
	int i = offset;
	int j = anotherString.offset;

	if (i == j) {
	    int k = i;
	    int lim = n + i;
	    while (k < lim) {
		char c1 = v1[k];
		char c2 = v2[k];
		if (c1 != c2) {
		    return c1 - c2;
		}
		k++;
	    }
	} else {
	    while (n-- != 0) {
		char c1 = v1[i++];
		char c2 = v2[j++];
		if (c1 != c2) {
		    return c1 - c2;
		}
	    }
	}
	return len1 - len2;
    }

ohne Strings auf irgendeine Weise zu vergleichen gibts jedenfalls keine String-Sortierung
 

bLaSt

Aktives Mitglied
Das Problem ist eben, dass man nicht "implements Comparable" verwenden soll.

Aso, wenn ich das jetzt nicht mehr neu implementieren muss, dann reicht es doch aus, einfach ein String-Array anstatt eines int-Arrays zu verwenden??

Aber wie kann ich dann vergleichen? Da muss sich wohl mein Lehrer geirrt haben. oder?? ???:L

Um compareTo() zu verwenden brauchst du kein implements Comparable. Das kannst du ganz normal benutzen. Wir haben erst kürzlich sowas gemacht wo man ein Studentobjekt hatte und dieses nach Namen sortieren sollte mit Hilfe des Insertion Sort. Ich stell dir mal den Code Ausschnitt ein, damit du siehst was ich mein.

Java:
public class StudentArray {
	public void binarySort(Student[] arrayp, String namep){		// binärer Suchalgorihtmus. Vorher muss jedoch nach Namen sortiert worden sein
		sortStudentArray(arrayp);
		int l,r,m;																	
		l=0;																		// linke Seite, bei Arrays Standardmässig auf 0 gesetzt
		r = arrayp.length-1;														// rechte Seite, immer die Größe des Arrays-1, da die Zählung bei 0 beginnt
		m = 0;
		while(l <= r){
			m = (l+r)/2;
			if (namep.compareTo(arrayp[m].getName()) < 0){							// der Name wird lexikografisch nach unicode verglichen. verglichen wird der
				r = m-1;															// übergebene Name mit dem Namen aus dem Array, beginnend bei 0
			}																		// sollte dieser Wert kleiner 0 sein, so wird der äusserste Wert um eines verringert,
			else{																	// da das Feld leer ist
				l = m+1;															// Im anderen Fall wird die linke Seite um eins erhöht, um durch die einzelnen Felder
			}																		// zu schreiten
		}
		if (arrayp[r].getName().equals(namep)) {									// ist der aktuelle Name gleich dem übergebenen Namen, so wird es ausgegeben
			//System.out.println("l  :"+l+"   r   :"+r);
			System.out.println("\n" + arrayp[r].getName()+"\t"+arrayp[r].getAlter());
		}
		else {
			System.out.println("\nName nicht vorhanden\n");    								
		}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kumora ArrayIndexOutOfBoundsException bei einem Sortierverfahren Java Basics - Anfänger-Themen 2
B Wie funktionieren diese Methoden in diesem Sortierverfahren genau? Java Basics - Anfänger-Themen 2
G Sortierverfahren Java Basics - Anfänger-Themen 15
M Wie heisst dieses Sortierverfahren? Java Basics - Anfänger-Themen 6
S Sortierverfahren - wie Stabilität testen (im array) Java Basics - Anfänger-Themen 3
4 Methoden Array-Sortierverfahren funktioniert nicht Java Basics - Anfänger-Themen 6
D currentTimeMillis() in Sortierverfahren einbauen Java Basics - Anfänger-Themen 12
T Frage zu Relationen in Bezug auf Sortierverfahren Java Basics - Anfänger-Themen 7
J Sortierverfahren Java Basics - Anfänger-Themen 6
G Sortierverfahren importieren Java Basics - Anfänger-Themen 2
G Sortierverfahren Java Basics - Anfänger-Themen 10
N Sortierverfahren Java Basics - Anfänger-Themen 3
L Sortierverfahren Java Basics - Anfänger-Themen 6
E Bäume/ allgemeine Fragen Java Basics - Anfänger-Themen 21
S Allgemeine Java Codes lesen und verstehen Java Basics - Anfänger-Themen 7
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
X Allgemeine Hashtabelle - wie? Java Basics - Anfänger-Themen 4
TechGirl LinkedList - kurze allgemeine Frage Java Basics - Anfänger-Themen 17
M Allgemeine Java-Frage anhand bspw. Eclipse Java Basics - Anfänger-Themen 4
D Rekursion Allgemeine Fragen Java Basics - Anfänger-Themen 2
J Allgemeine Fragen zur GUI Java Basics - Anfänger-Themen 1
M Erste Schritte Allgemeine Fragen Java Basics - Anfänger-Themen 4
B KeyListener als allgemeine Methode Java Basics - Anfänger-Themen 5
S Allgemeine Fragen Java Basics - Anfänger-Themen 9
Luk10 OOP Sehr allgemeine Schnittstelle Java Basics - Anfänger-Themen 19
S allgemeine verständnisschwierigkeit Java Basics - Anfänger-Themen 5
G allgemeine Ressourcen-Verwaltung... Java Basics - Anfänger-Themen 3
T Allgemeine Frage Java Basics - Anfänger-Themen 3
T Hashset - Allgemeine Fragen Java Basics - Anfänger-Themen 19
J Allgemeine Fragen zur Programmierung Java Basics - Anfänger-Themen 36
S JDK installieren Allgemeine Fragen Java Basics - Anfänger-Themen 3
J Allgemeine Frage zu GUI´s in Java Java Basics - Anfänger-Themen 6
J [Neuling] Allgemeine Fragen zu Java Java Basics - Anfänger-Themen 20
S OOP Allgemeine Frage zu OOP Java Basics - Anfänger-Themen 4
A Allgemeine Frage zur Sichtbarkeit "private" Java Basics - Anfänger-Themen 5
U Arrays allgemeine Frage Java Basics - Anfänger-Themen 3
A Allgemeine Fragen zu Java Java Basics - Anfänger-Themen 7
G Allgemeine Frage-GUI Java Basics - Anfänger-Themen 10
J Methode, Allgemeine Frage Java Basics - Anfänger-Themen 5
W Allgemeine Fragen Java Basics - Anfänger-Themen 11
G GridLayout Allgemeine Fragen Java Basics - Anfänger-Themen 2
I Allgemeine fragen zu Socket server Java Basics - Anfänger-Themen 6
G Login - Allgemeine Fragen Java Basics - Anfänger-Themen 6
G Allgemeine Schnittstelle für Ausgabe? Java Basics - Anfänger-Themen 5
S Allgemeine Frage zu Sockets Java Basics - Anfänger-Themen 23
A Allgemeine Fragen zu Java Java Basics - Anfänger-Themen 10
W allgemeine Fragen Java Basics - Anfänger-Themen 6
O allgemeine Exceptions abfangen Java Basics - Anfänger-Themen 17
E Allgemeine Anfrage Java lernen Java Basics - Anfänger-Themen 3
D Allgemeine Objekte abspeichern Java Basics - Anfänger-Themen 9
C Rechnen mit Brüchen, ist meine Lösung soweit richtig? Java Basics - Anfänger-Themen 4
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
W Texteingabe - Bedeutung Fehlermeldung, Lösung? Java Basics - Anfänger-Themen 18
M Kennt jemand die richtige Lösung? Java Basics - Anfänger-Themen 7
H Codewars akzeptiert Lösung nicht Java Basics - Anfänger-Themen 29
A Selbe Aufgaben stellung, andere Lösung Java Basics - Anfänger-Themen 7
M Lösung Aufgabe - Java Programmiren lernen für Dummies Java Basics - Anfänger-Themen 11
ZH1896ZH Java-SemesterTest ohne Lösung :( Java Basics - Anfänger-Themen 47
D Beim Programmieren auf die Logisch einfache Lösung kommen. Java Basics - Anfänger-Themen 17
M Hamstersimulator- lösung hilfe benotigt Java Basics - Anfänger-Themen 3
M Hamstersimulator- Lösung? Java Basics - Anfänger-Themen 3
E Mathematische Aufgabe: Antwort entspricht nicht der Lösung Java Basics - Anfänger-Themen 5
W Tipps/Anmerkungen zu meiner Lösung?! Java Basics - Anfänger-Themen 2
H lösung aufgabe Java Basics - Anfänger-Themen 12
J Gleiche Methode in 2 verschiedenen Klassen - Lösung ? Java Basics - Anfänger-Themen 8
P java.lang.ClassCastException Bedeutung und Lösung Java Basics - Anfänger-Themen 3
M Methoden Fehler und finde die Lösung nicht wirklich Java Basics - Anfänger-Themen 6
J RPN Taschenrechner - keine Lösung!! Java Basics - Anfänger-Themen 84
I java.lang.ArrayIndexOutOfBoundsException at lösung.main Java Basics - Anfänger-Themen 3
J Best Practice DOS Fenster mit Befehlszeile (Lösung) Java Basics - Anfänger-Themen 2
S mehrfache if-Abfragen - beste Lösung Java Basics - Anfänger-Themen 1
J Einfache pub/sub Lösung mit ausführlicher Doku Java Basics - Anfänger-Themen 5
D Best Practice Testdaten. Was ist eine saubere Lösung? Java Basics - Anfänger-Themen 3
D Datentypen Datentyperstellung | Kompiler sagt Syntax Error doch ich find keine Lösung Java Basics - Anfänger-Themen 2
V Verstehe die Lösung einer Aufgabe von Grunkurs-Java nicht. Java Basics - Anfänger-Themen 11
P Verstehe Lösung einer Aufgabe von "Grundkurs-Java" nicht Java Basics - Anfänger-Themen 5
E Brauche eine Antwort zum Thema RegEx ( Alternative zur Lösung auch gesucht ) Java Basics - Anfänger-Themen 5
C Lösung für RegEx in Java gesucht Java Basics - Anfänger-Themen 2
S Eine rekursive Lösung Java Basics - Anfänger-Themen 4
G OOP [Eilig] Biete 10€ für Lösung von 2 Grundlagen-Aufgaben Java Basics - Anfänger-Themen 6
C For-Schleife wie kommt man auf die Lösung? Java Basics - Anfänger-Themen 2
M Erste Schritte boolean: ist Zahl Hexadezimal - Lösung verwirrend Java Basics - Anfänger-Themen 6
C Best Practice Was ist die elegantere Lösung bzgl. Klassenaufteilung in Robocode ? Java Basics - Anfänger-Themen 3
O Funktioniert dies? Und gibt es eine bessere Lösung? Java Basics - Anfänger-Themen 6
G Vererbung Lösung Standardproblem Java Basics - Anfänger-Themen 2
J Lösung eines Zahlenintervall wierd an der Falschen Stelle angezeigt. Java Basics - Anfänger-Themen 8
S Bessere Lösung? Java Basics - Anfänger-Themen 4
3 Bitte um Hilfe bei Lösung einer Aufgabe Java Basics - Anfänger-Themen 16
D speicherschonendere lösung? Java Basics - Anfänger-Themen 19
M Interval Teilmenge bestimmen - Fehler in meiner Lösung Java Basics - Anfänger-Themen 6
M Suche Korrektor für meine Lösung (FH: Java1 - Übungsklausur) Java Basics - Anfänger-Themen 4
F OOP Wieder mal Zugriffsprobleme... (Lösung am Ende) Java Basics - Anfänger-Themen 11
U JTable viele möglichkeiten, keine Lösung Java Basics - Anfänger-Themen 5
T Objektübergabe - saubere Lösung? Java Basics - Anfänger-Themen 3
S Bessere Lösung zu häufigem instanceof Java Basics - Anfänger-Themen 25
U Rekursive lösung von pascal dreieck Java Basics - Anfänger-Themen 11
S LineNumberReader - bessere Lösung möglich? - Log4J Java Basics - Anfänger-Themen 9
A brauche eine Lösung für Problem bei Moorhuhn-Version Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben