36
Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14 http://c.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ

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

Embed Size (px)

Citation preview

Page 1: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C

Sortieren, Suchen

Hochschule Fulda – FB AI

Sommersemester 2013/14

http://c.rz.hs-fulda.de

Peter Klingebiel, HS Fulda, DVZ

Page 2: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2

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

Page 3: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3

Sortieren 2

• 1. Durchlauf bei Bubblesort

Page 4: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4

Sortieren 3

Page 5: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5

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);

Page 6: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6

Sortieren 5

• Bubblesort für Feld von Strings

Page 7: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7

Sortieren 6

• Sortierprogramm für Strings

Page 8: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8

Sortieren 7

• Diskussion– Stabilität?– Geschwindigkeit?

Page 9: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9

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);

Page 10: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10

Sortieren 9

• Prinzip: teile und herrsche

• http://de.wikipedia.org/wiki/Quicksort

Page 11: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11

Sortieren 10

• Quicksort für Feld von Strings

Page 12: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12

Sortieren 11

• Sortierprogramm für Strings

Page 13: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13

Sortieren 12

• Diskussion– Stabilität?– Geschwindigkeit?

Page 14: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14

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

Page 15: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15

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;}

Page 16: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16

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) ...

Page 17: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17

Sortieren 16

• Bubblesort generisch

Page 18: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18

Sortieren 17

• Quicksort generisch

Page 19: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19

Sortieren 18

• sortlib – snumcmp()

Page 20: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20

Sortieren 19

• sortlib – sswapv()

Page 21: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21

Sortieren 20

• bsort5

Page 22: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22

Sortieren 21

• qsort5

Page 23: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23

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;

Page 24: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24

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));}

Page 25: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25

Sortieren 24

• personal.c

Page 26: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26

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

Page 27: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27

Suchen 2

• Beispiel: Suche in Integer-Feld

Page 28: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28

Suchen 3

• Binäre Suche: teile und finde

Page 29: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29

Suchen 4

• 1 Schritt: teilen und vergleichen

Page 30: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30

Suchen 5

• 2. Schritt: weiter teilen und vergleichen

Page 31: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31

Suchen 6

• 3. Schritt: weiter teilen und vergleichen

Page 32: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32

Suchen 7

• 4. Schritt: teilen und finden

Page 33: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33

Suchen 8

• Binärsuche: teilen und finden

Page 34: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34

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 */}

Page 35: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35

Suchen 10

• binsearchi.c - Binärsuche in int-Feld

Page 36: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36

Suchen 11

• binsearchs.c - Binärsuche in String-Feld