![Page 1: Programmieren in C Sortieren, Suchen Hochschule Fulda – FB AI Sommersemester 2013/14 Peter Klingebiel, HS Fulda, DVZ](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/1.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/2.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/3.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/4.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/5.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/6.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/7.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/8.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/9.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/10.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/11.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/12.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/13.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/14.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/15.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/16.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/17.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/18.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/19.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/20.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/21.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/22.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/23.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/24.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/25.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/26.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/27.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/28.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/29.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/30.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/31.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/32.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/33.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/34.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/35.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062318/55204d8049795902118d3057/html5/thumbnails/36.jpg)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36
Suchen 11
• binsearchs.c - Binärsuche in String-Feld