Sortieren I - Bubblesort - void bubblesort( int n, int daten[]) { int i, k, t; for( i = n-1; i > 0; i--) for( k = 0; k < i; k++) if( daten[k] > daten[k+1]) t = daten[k]; daten[k] = daten[k+1]; daten[k+1] = t; } Programmierung 2 FH Bingen
Sortieren II - Selectionsort - void selectionsort( int n, int daten[]) { int i, k, t, min; for( i = 0; i < n-1; i++) min = i; for( k = i+1; k < n; k++) if( daten[k] < daten[min]) min = k; } t = daten[min]; daten[min] = daten[i]; daten[i] = t; Programmierung 2 FH Bingen
Sortieren III - Insertionsort- void insertionsort( int n, int daten[]) { int i, j, v; for( i = 1; i < n; i++) v = daten[i]; for( j = i; j>0 && (daten[j-1] > v); j--) daten[j] = daten[j-1]; daten[j] = v; } Programmierung 2 FH Bingen
Sortieren IV-1 - Shellsort- void insertion_h_sort ( int n, int daten[], int h) { int i, j, v; for( i = h; i < n; i++) v = daten[i]; for( j = i; (j >= h) && (daten[j-h] > v); j -= h) daten[j] = daten[j-h]; daten[j] = v; } Programmierung 2 FH Bingen
Sortieren IV- 2 - Shellsort- void shellsort( int n, int daten[]) { int i, j, h, v; for( h = 1; h <= n/9; h = 3*h+1) ; for( ; h > 0; h /= 3) insertion_h_sort(n, daten, h); } Programmierung 2 FH Bingen
Sortieren IV - 3 - Shellsort- void shellsort( int n, int daten[]) { int i, j, h, v; for( h = 1; h <= n/9; h = 3*h+1) ; for( ; h > 0; h /= 3) for( i = h; i < n; i++) v = daten[i]; for( j = i; (j >= h) && (daten[j-h] > v); j -= h) daten[j] = daten[j-h]; daten[j] = v; } Programmierung 2 FH Bingen
Sortieren V - 1 - Quicksort - void aufteilung ( int links, int rechts, int daten[]) { int median, i, j, t; median = daten[rechts]; i = links-1; j = rechts; for( ; ;) while( daten[++i] < median); while( daten[--j] > median); if( i >= j) break; t = daten[i]; daten[i] = daten[j]; daten[j] = t; } daten[rechts] = daten[i]; daten[i] = median; Programmierung 2 FH Bingen
Sortieren V - 2 - Quicksort - void quicksort( int links, int rechts, int daten[]) { int median, i, j, t; if( rechts > links) median = daten[rechts]; i = links-1; j = rechts; for( ; ;) while( daten[++i] < median) ; while( daten[--j] > median) if( i >= j) break; t = daten[i]; daten[i] = daten[j]; daten[j] = t; } daten[rechts] = daten[i]; daten[i] = median /* i ist der Index des Median */ quicksort( links, i-1, daten); quicksort( i+1, rechts, daten); Programmierung 2 FH Bingen
Sortieren VI - 1 - Heapsort - void adjustheap( int n, int daten[], int k) { int j, v; v = daten[k]; while( k < n/2) j = 2*k+1; if( (j < n-1) && (daten[j] < daten[j+1])) j++; if( v >= daten[j]) break; daten[k] = daten[j]; k = j; } daten[k] = v; Programmierung 2 FH Bingen
Sortieren VI - 2 - Heapsort - void heapsort( int n, int daten[]) { int k, t; for( k = n/2; k > 0;) adjustheap( n, daten, --k); while( --n > 0) t = daten[0]; daten[0] = daten[n]; daten[n] = t; adjustheap( n, daten, 0); } Programmierung 2 FH Bingen
Übungsblatt 2 1.Aufgabe: Eine Aufgabe für E-TechinkerInnen: Ein Automat (exakt: Mealy-Automat) liest nicht negative, ganze Zahlen nacheinander ein und gibt als Ergebnis auch wieder eine nicht-negative, ganze Zahl aus, deren Wert sich aus der Eingabe und einem inneren Zustand des Automaten berechnet. Dieser Zustand ist ebenfalls durch eine nicht-negative Zahl ganze Zahl gegeben. Der Automat stoppt, wenn er einen Zustand ein zweites Mal annimmt. Die jeweils erreichten Zustände werden in einem Feld gespeichert. Der Automat vollzieht die folgenden Schritte: Ausgabe des aktuellen Zustands, Einlesen der nächsten Eingabe im Zustand z, Berechnen des neuen Zustands aus (z+x)%11, Berechnen der Ausgabe als z+x, Überprüfen des Abbruchkriteriums. Realisieren Sie den Automaten als Klasse, die mit einem Startzustand initialisiert wird und die solange eine Eingabe fordert, bis der Automat stoppt. Die angenommen Zustände sollen in einem Feld gespeichert werden. 2. Aufgabe: Variation verketteter Listen: Definieren Sie eine Klasse Doppelt-verkettete Liste ganzer Zahlen, also eine Liste, in der man vor- und zurücklaufen kann. An den Enden ist natürlich nur eine Richtung möglich. Implementieren Sie die üblichen Listenfunktionen: Einfügen eines Elements, Entfernen eines Elements, Navigieren in der Liste bei vorgegebener Richtung, Drucken der Liste. Wie würden Sie das Sortieren der Liste realisieren? Programmierung 2 FH Bingen
Übungsblatt 3 1.Aufgabe: Anwendung verketteter Listen Die Klasse zur Implementierung einer Liste (einfach oder doppelt-verkettet) soll zur Implementierung eines Stacks (Keller-Speichers, LIFO - last in, first out) verwendet werden. Entwickeln Sie die neuen Methoden push (item) und pop(). push(item) speichert ein Element auf dem Stack (d.h., am Anfang des Stacks); pop() löscht das zuletzt gespeicherte Element vom Stack und liefert es als Funktionswert zurück. Es gilt also: pop (push(item)) == item; push (pop()) lässt den nicht-leeren Stack unverändert. 2. Aufgabe Anwendung eines Stacks Benutzen Sie den Stack, um zu evaluieren, ob ein vorgelegter String ein korrektes "Klammergebirge" darstellt. Beispiel: ({[](({([])})){([])}{}}) Anmerkung: Es genügt hier nicht zu zählen, ob die Zahl der öffnenden und schliessenden Klammern übereinstimmt. Programmierung 2 FH Bingen