Sie sind auf Seite 1von 3

Labor Informatik 2 Beck, Dausmann, Warendorf

Blatt 3 Sortieren, Funktionszeiger, Zeitmessungen

Aufgabe 3.1 Übergabe von Reihungen/Arrays, Funktionszeiger

a) Lesen Sie die Hilfe zu der Funktion qsort aus der Bibliothek <stdlib.h>.Hinweis: Ziel
der Aufgabe ist es, Ganzzahlwerte aus einer Datei einzulesen und diese dann mit der bei C
vorhandenen Funktion qsort() zu sortieren. Am Ende der Aufgabe wird ein main()
erwartet, das in etwa folgende Ein-/Ausgabe hat:
Eingegebene Elemente:
4, 5, 7, 5, 7, 453, 2, -4,
6, -67, 4,
Sortierte Elemente:
-67, -4, 2, 4, 4, 5, 5, 6,
7, 7, 453,

b) Schreiben Sie eine Funktion (eigene C-Datei), die als Funktionsparameter für die qsort–
Funktion dient und zwei int-Werte miteinander vergleicht.

c) Nutzen Sie die qsort–Funktion und die Funktion aus b) um ein int-Array in Ihrer main–
Funktion zu sortieren. Zum Füllen und Ausgeben des Arrays greifen Sie auf den Modul aus
Aufgabe 1.4 zurück.

Aufgabe 3.2 Sortieren durch Auswählen, Funktionspointer

a) Ergänzen Sie den Modul zur Bearbeitung von int-Arrays aus Aufgabe 1.4 um eine
Funktion sortArray() mit folgendem Prototyp:
void sortArray( int * array, int size,
int (* compare) (void *elem1, void *elem2));

Das Array soll in dieser Funktion sortiert werden. Implementieren Sie "Sortieren durch
Auswählen". Nutzen Sie dabei die Funktion myCompare() aus der vorherigen Aufgabe. Sie
soll wie bei qsort() hier an sortArray() als Parameter übergeben werden.

b) Schreiben Sie nun ein Hauptprogramm, das ein Array mit Hilfe der Funktion
fillArray() mit Zufallszahlen füllt, es anschließend sortiert und das sortierte Array
ausgibt.

Blatt 3 Seite 1 Version 1.1 vom 10.3.2006


Labor Informatik 2 Beck, Dausmann, Warendorf

Aufgabe 3.3 Konkretes Messen eines Suchvorganges, Zeitverhalten

Gegeben seien die in der Vorlesung behandelten Datenstrukturen zur Verwaltung von
Studenten in einer einfach verketteten Liste.
#define NAME_LEN (16+1)

typedef struct student{


char name[NAME_LEN]; /* Nachname, Vorname */
int id; /* Matr.Nr. */
} Student;

typedef struct studlist {


Student * p; /* Zeiger auf Nutzlast */
struct studList * next; /* Nächster in Liste */
} StudList;

a) Die Header-Dateien studlist.h und die C-Dateien studlist.c und main.c zu


dem Vorlesungsbeispiel liegen auf dem WORK-Laufwerk bereit. Kopieren Sie diese Dateien
in Ihren Arbeitsbereich. Machen Sie sich mit dem Programm vertraut und testen Sie es.

b) Messen Sie die Implementierung von list_SearchId durch. Das heißt, dass Sie Ihre
Liste schrittweise mit Studierenden füllen, deren Matrikelnummer eine Zufallszahl ist. Der
Name ist nicht wichtig, da er ja nicht als Schlüssel dient. Wenn die Liste mit 2, 4, 8, 16, .. 216
Elementen gefüllt ist, führen Sie eine Messung durch: Sie suchen z.B. 1000000 Mal nach
wieder zufällig gewählten Matrikelnummern. Die Zeit für diese 1000000 Suchvorgänge
messen Sie. Das kann man mit der clock()-Funktion machen. Siehe das Programmbeispiel
aus der Hilfe.

c) Das Ergebnis der Messung dokumentieren Sie bitte in folgender Tabelle und in einem
Excel-Diagramm. Welche Abhängigkeit von n (O-Notation) hat der Algorithmus nach dieser
Auswertung?

d) Messen Sie auch einmal noch mehr Elemente in der Liste. Warum wird das Ergebnis jetzt
so dramatisch schlecht.

Blatt 3 Seite 2 Version 1.1 vom 10.3.2006


Labor Informatik 2 Beck, Dausmann, Warendorf

Anzahl n von Stud. in Liste ld(n) Zeit für 1 000 000


Suchvorgänge
1 0
2 1
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536

Aufgabe 3.4 Rekursives Durchwandern von linearen Listen

a) Ersetzen Sie die iterative Implementierung der Funktion list_SearchId () durch


eine rekursive Lösung. Testen Sie Ihre Lösung mit dem ursprünglichen Hauptprogramm aus
Aufgabe 3.3.

b) Messen Sie diese Implementierung von list_SearchId() ebenfalls analog zu den


Messungen aus Aufgabe 3.3.

c) Das Ergebnis der Messung dokumentieren Sie bitte ebenfalls analog zu Aufgabe 3.3.
Welche Abhängigkeit von n (O-Notation) hat dieser Algorithmus nach dieser Auswertung?

Blatt 3 Seite 3 Version 1.1 vom 10.3.2006