1 / 57

Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3

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.

sasha
Télécharger la présentation

Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

  4. Sortieren 3 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); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

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

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

  8. Sortieren 7 • Diskussion • Stabilität? • Geschwindigkeit? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

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

  10. Sortieren 9 • Prinzip: teile und herrsche • http://de.wikipedia.org/wiki/Quicksort Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

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

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

  13. Sortieren 12 • Diskussion • Stabilität? • Geschwindigkeit? 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 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;} 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) ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  17. Sortieren 16 • Bubblesort generisch Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  18. Sortieren 17 • Quicksort generisch Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

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

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

  21. Sortieren 20 • bsort5 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  22. Sortieren 21 • qsort5 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; 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 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

  25. Sortieren 24 • personal.c 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

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

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

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

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

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

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

  33. Suchen 8 • Binärsuche: teilen und finden 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 */} Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

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

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

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

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

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

  40. Dynamische Listen 4 • Einfache Liste: Erzeugung 1. Element Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  41. Dynamische Listen 5 • Einfache Liste: 2. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  42. Dynamische Listen 6 • Einfache Liste: 3. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  43. Dynamische Listen 7 • Einfache Liste: 4. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  44. Dynamische Listen 8 • Einfache Liste: 5. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  45. Dynamische Listen 9 • Einfache Liste: Verkettung zum Ringpuffer Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

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

  47. Dynamische Listen 11 • slist.c - einfach verkettete Liste Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  48. Dynamische Listen 12 • sortlist.c - einfach verkettete sortierte Liste Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  49. Dynamische Listen 13 • Doppelte Liste: Erzeugung 1. Element Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  50. Dynamische Listen 14 • Doppelte Liste: 2. Element und Verkettung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

More Related