Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2014 Peter Klingebiel, HS Fulda, DVZ.

Ähnliche Präsentationen


Präsentation zum Thema: "Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2014 Peter Klingebiel, HS Fulda, DVZ."—  Präsentation transkript:

1 Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester Peter Klingebiel, HS Fulda, DVZ

2 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ2 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

3 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ3 Sortieren 2 1. Durchlauf bei Bubblesort

4 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ4 Sortieren 3

5 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ5 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 v[j+1]) swap(v, j, j+1);

6 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ6 Sortieren 5 Bubblesort für Feld von Strings

7 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ7 Sortieren 6 Sortierprogramm für Strings

8 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ8 Sortieren 7 Diskussion –Stabilität? –Geschwindigkeit?

9 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ9 Sortieren 8 Schnellerer Algorithmus Quicksort rekursiver Algorithmus für int -Feld void 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);

10 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ10 Sortieren 9 Prinzip: teile und herrsche

11 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ11 Sortieren 10 Quicksort für Feld von Strings

12 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ12 Sortieren 11 Sortierprogramm für Strings

13 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ13 Sortieren 12 Diskussion –Stabilität? –Geschwindigkeit?

14 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ14 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

15 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ15 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; }

16 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ16 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)...

17 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ17 Sortieren 16 Bubblesort generisch

18 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ18 Sortieren 17 Quicksort generisch

19 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ19 Sortieren 18 sortlib – snumcmp()

20 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ20 Sortieren 19 sortlib – sswapv()

21 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ21 Sortieren 20 bsort5

22 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ22 Sortieren 21 qsort5

23 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ23 Sortieren 22 Mit generischen Funktionen und Funktionen als Parametern auch Sortieren von komplexeren Datenstrukturen möglich Beispiel: Personaldaten typedef 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;

24 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ24 Sortieren 23 Personalliste nach verschiedenen Kriterien (Name, P-Nr., Geburtsdatum) sortierbar Implementierung einer Vergleichsfunktion Beispiel: Nachnamen vergleichen int 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)); }

25 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ25 Sortieren 24 personal.c

26 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ26 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

27 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ27 Suchen 2 Beispiel: Suche in Integer-Feld

28 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ28 Suchen 3 Binäre Suche: teile und finde

29 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ29 Suchen 4 1 Schritt: teilen und vergleichen

30 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ30 Suchen 5 2. Schritt: weiter teilen und vergleichen

31 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ31 Suchen 6 3. Schritt: weiter teilen und vergleichen

32 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ32 Suchen 7 4. Schritt: teilen und finden

33 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ33 Suchen 8 Binärsuche: teilen und finden

34 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ34 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 x) r = m - 1; /* Rechts weiter */ else l = m + 1; /* Links weiters */ }

35 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ35 Suchen 10 binsearchi.c - Binärsuche in int-Feld

36 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ36 Suchen 11 binsearchs.c - Binärsuche in String-Feld


Herunterladen ppt "Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2014 Peter Klingebiel, HS Fulda, DVZ."

Ähnliche Präsentationen


Google-Anzeigen