580 likes | 869 Views
Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3. Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ. Sortieren 1.
E N D
Informatik IIGrundlagen der ProgrammierungProgrammieren in CModule und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ
Sortieren 1 • Sortieren von Zahlen, Strings, allgemein von Daten, ist oft auftretende Aufgabenstellung • Meist: Daten sind in Feldern vorhanden • Sortieren von Feldelementen • Intuitiver Algorithmus: • Feld von oben nach unten (oder von links nach rechts) durchlaufen und elementweise sortieren • Feld solange immer wieder durchlaufen, bis Feld sortiert ist • Bubblesort-Algorithmus • http://de.wikipedia.org/wiki/Bubblesort Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 2 • 1. Durchlauf bei Bubblesort Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 3 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 4 • die größten Elemente wandern nach und nach an das Ende des Feldes • steigen wie Blasen auf Bubblesort • Algorithmus für int-Feld mit n Elementen:void bsort(int v[], int n) int i, j; for(i = 0; i < n; i++) for(j = 0; j < n-i-1; j++) if(v[j] > v[j+1]) swap(v, j, j+1); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 5 • Bubblesort für Feld von Strings Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 6 • Sortierprogramm für Strings Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 7 • Diskussion • Stabilität? • Geschwindigkeit? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 8 • Schnellerer Algorithmus Quicksort • rekursiver Algorithmus für int-Feldvoid qsort(int v[], int left, int right) int i, last; if(left >= right) return; swap(v, left, (left + right) / 2); last = left; for(i = left + 1; i <= right; i++) if(v[i] < v[left]) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last - 1); qsort(v, last + 1, right); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 9 • Prinzip: teile und herrsche • http://de.wikipedia.org/wiki/Quicksort Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 10 • Quicksort für Feld von Strings Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 11 • Sortierprogramm für Strings Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 12 • Diskussion • Stabilität? • Geschwindigkeit? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 13 • bisher: nur Sortieren von Strings • Es gibt aber oft andere Typen zu sortieren, z.B. Integer-, Double-, Struct-Typen usw. • Generischer Sortieralgorithmus für Felder • Sortieralgorithmen identisch bis auf • Vergleichsfunktion comp() • Austauschfunktion swap() • Generische Funktionsparameter • Funktionen als Parameter Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 14 • Generische Funktionsparameter • Nutzung des Typs void • Beispiel: swap-Funktion void swapv(void *s[], int i, int j){ void *t; t = s[i]; s[i] = s[j]; s[j] = t;} Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 15 • Funktionen als Parameter • C erlaubt, Funktionen als Parameter an Funktionen zu übergeben und aufzurufen • Übergabe der Funktion comp()void bsortv(void *v[], int n, int (*comp)(void *, void *)){ ... • Aufruf der Funktion comp() ...if((* comp)(v[j], v[j+1]) > 0) ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 16 • Bubblesort generisch Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 17 • Quicksort generisch Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 18 • sortlib – snumcmp() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 19 • sortlib – sswapv() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 20 • bsort5 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 21 • qsort5 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 22 • Mit generischen Funktionen und Funktionen als Parametern auch Sortieren von komplexeren Datenstrukturen möglich • Beispiel: Personaldatentypedef struct _person { /* Personaleintrag: */ int no; /* Personalnummer */ char *nn; /* Nachname */ char *vn; /* Vorname */ int gj; /* Geburtsjahr */ int gm; /* Geburtsmonat */ int gt; /* Geburtstag */} person_t, *person_p; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 23 • Personalliste nach verschiedenen Kriterien (Name, P-Nr., Geburtsdatum) sortierbar • Implementierung einer Vergleichsfunktion • Beispiel: Nachnamen vergleichenint compnn(person_p p1, person_p p2){ int n; if(n = strcmp(p1->nn, p2->nn)) return(n); else return(strcmp(p1->vn, p2->vn));} Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 24 • personal.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 1 • Häufige Aufgabe: in größeren Datenmengen nach Einzelelementen suchen • Oft: Daten in Feldern gespeichert • Intuitives Verfahren: Feld mit Daten von Anfang bis Ende durchlaufen und nach gesuchtem Element fahnden • ist bei großen Datenmengen sehr langsam • notwendig bei unsortierten Daten / Feldern • in sortierten Feldern mit binärer Suche arbeiten Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 2 • Beispiel: Suche in Integer-Feld Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 3 • Binäre Suche: teile und finde Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 4 • 1 Schritt: teilen und vergleichen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 5 • 2. Schritt: weiter teilen und vergleichen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 6 • 3. Schritt: weiter teilen und vergleichen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 7 • 4. Schritt: teilen und finden Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 8 • Binärsuche: teilen und finden Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 9 int binsearchi(int v[], int n, int x, int *ind)int m, l, r; /* Mitte, links, rechts */l = 0; /* links: 1. Element */r = n - 1; /* rechts: letztes El. */while(1) { if(r < l) return(0); /* kein Treffer */ m = l + ((r - l) / 2); /* Bereich halbieren */ if (v[m] == x) { /* Elem. x gefunden */ *ind = m; return(1); } if (v[m] > x) r = m - 1; /* Rechts weiter */ else l = m + 1; /* Links weiters */} Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 10 • binsearchi.c - Binärsuche in int-Feld Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Suchen 11 • binsearchs.c - Binärsuche in String-Feld Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 1 • Häufig ist die Anzahl der zu speichernden und zu bearbeitenden Daten erst zur Laufzeit des Programms bekannt • Felder ungeeignet, da diese zur Compilezeit dimensioniert werden müssen • dynamische Datenstrukturen • einfach verkettete Listen • doppelt verkettete Listen • Bäume • usw. Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 2 • Beispiel: einfach verkettete Liste/* Datentyp f. einfach verkettete Liste */ typedef struct _slist { int value; /* Daten */ struct slist *next; /* Nachfolger */} slist; • Beispiel: doppelt verkette Liste/* Datentyp f. doppelt verkettete Liste */typedef struct _dlist { int value; /* Daten */ struct dlist *prev; /* Vorgaenger */ struct dlist *next; /* Nachfolger */} dlist; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 3 • Objekte der Listentypen werden zur Laufzeit • alloziertslist *insert(slist *llp, int value){ slist *nlp; nlp = (slist *) malloc(sizeof(slist)); • besetzt bzw. initialisiert nlp-> value = value; nlp->next = NULL; • und in die Liste eingehängt if(llp) llp->next = nlp; return(nlp);} Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 4 • Einfache Liste: Erzeugung 1. Element Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 5 • Einfache Liste: 2. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 6 • Einfache Liste: 3. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 7 • Einfache Liste: 4. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 8 • Einfache Liste: 5. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 9 • Einfache Liste: Verkettung zum Ringpuffer Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 10 • Erstes Element wird oft Wurzel, Anker oder Kopf der Liste genannt • Durchlaufen der Liste i.d.R. von der Wurzel der Liste ausslist *root, *slp;for(slp = root; slp; slp = slp->next) printf("%d\n", slp->value); • Wird das letzte Listenobjekt mit der Wurzel verlinkt Ringpuffer • Sortieren bei Erzeugen der Liste möglich Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 11 • slist.c - einfach verkettete Liste Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 12 • sortlist.c - einfach verkettete sortierte Liste Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 13 • Doppelte Liste: Erzeugung 1. Element Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamische Listen 14 • Doppelte Liste: 2. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ