Beruflich Dokumente
Kultur Dokumente
7
arrays und
vectors,
Suchen und
Sortieren
2006 Pearson Education, Inc. All rights reserved.
2
7.1 Einfhrung
7.2 Arrays
7.3 Deklaration von arrays
7.4 Beispiele zum Gebrauch von arrays
7.5 bergabe von arrays an Funktionen
7.6 Fallstudie: Die Klasse GradeBook mit einem array zum
Abspeichern von Noten
7.7 Einfhrung in die C++ STL Klasse vector
7.8 Suchen und Sortieren
7.8.1 Lineare Suche
7.8.2 Binre Suche
7.8.3 Sortieren durch direktes Einfgen (Insertion-Sort)
7.8.4 Merge-Sort (rekursive Implementierung)
7.9 Mehrdimensionale arrays
7.10 Fallstudie: Die Klasse GradeBook mit einem zweidimensionalen
array
7.1 Einfhrung
Array
Datenstruktur, die zusammengehrige Datenelemente
desselben Typs enthlt
Datenstruktur der Sprache C++ (STL-Klasse') in zwei
Varianten:
array: Behlt immer die Gre, in der es vom Compiler
whrend des bersetzungsvorgangs erzeugt wurde
Weniger komfortabel zu nutzen, aber schneller und
weniger Speicherverbrauch (normalerweise auf Stack)
vector: Gre kann whrend der Programmausfhrung
verndert werden
Bei Bedarf automatisches Wachsen und Schrumpfen,
aber langsamer und mehr Speicherverbrauch (auf Heap)
7.1 Einfhrung
7.2 Arrays
Array (array, vector und C-Array)
Gruppe aufeinanderfolgender Speicherpltze
Alle haben denselben Typ.
Index
Ganzzahliger Positionszhler, der einen spezifischen Platz, d.h ein
spezifisches Element im Array anspricht
Wird in eckige Klammern [ ] gesetzt
Muss positive ganze Zahl oder ganzzahliger Ausdruck sein
Das erste Element hat den Index 0.
7.2 Arrays
Hufiger Programmierfehler
Element Value
0 0
1 0 n[ j ] gibt den int zurck, der dem
2 0 Index j im Array n zugeordnet ist.
3 0
4 0
5 0
6 0
7 0
8 0 Jeder int wurde mit 0 initialisiert.
9 0 2006 Pearson Education,
Inc. All rights reserved.
13
Hufiger Programmierfehler
Element Value
0 32
1 27
2 64
3 18
4 95
5 14
6 90
7 70
8 60
9 37
2006 Pearson Education,
Inc. All rights reserved.
18
Element Value
0 2
1 4
2 6
3 8
4 10
5 12
6 14
7 16
8 18
9 20 2006 Pearson Education,
Inc. All rights reserved.
20
Konstante Variablen
Deklaration unter Verwendung des const Qualifizierers
Auch als Namenskonstanten oder Read-Only-Variablen
bezeichnet
Mssen zum Zeitpunkt ihrer Deklaration mit einem
konstanten Ausdruck initialisiert werden und knnen
danach nicht mehr modifiziert werden
Knnen berall dort stehen, wo ein konstanter Ausdruck
erwartet wird
Hufiger Programmierfehler
Hufiger Programmierfehler
Bereichsbasierte for-Schleife
Um ber alle Elemente in einem Array (bzw. allgemeiner:
Container) zu iterieren, gibt es eine krzere Form der for-
Schleife, die bereichsbasierte for-Schleife :
for( int n : numbers ) {
cout << n << ' ';
}
Alle Elemente des arrays numbers werden der Reihe nach
ber den Bezeichner n angesprochen.
Hierdurch ist die Definition eines Zhlers zum Durchlaufen des
Arrays nicht mehr ntig und die hufige Fehlerquelle, dass
dieser Zhler den erlaubten Bereich fr die Indices verlsst,
wird vermieden.
(2 von 2)
Student 1: 87
Student 2: 68 fig07_18.cpp
Student 3: 94
Student 4: 100
Student 5: 83
(2 von 2)
Student 6: 78
Student 7: 85
Student 8: 91
Student 9: 76
Student 10: 87
Grade distribution:
0-9:
10-19:
20-29:
30-39:
40-49:
50-59:
60-69: *
70-79: **
80-89: ****
90-99: **
100: *
Suchalgorithmen
Finden des Elements, das zu einem gegebenen
Suchschlssel passt, in einer gegebenen Datenmenge
Falls ein solches Element existiert
Wesentliche Differenz zwischen unterschiedlichen
Suchalgorithmen
Aufwand, der fr die Durchfhrung der Suche bentigt wird
Ist insbesondere von der Anzahl der Datenelemente
abhngig
Kann in der Gro-O-Schreibweise angegeben werden
Gro-O-Schreibweise
Misst das Anwachsen der Laufzeit eines Algorithmus im
Verhltnis zur Anzahl der verarbeiteten Werte
Betont die dominanten Anteile
Vernachlssigt die Anteile, die unwichtig werden, wenn n
stark anwchst
Vernachlssigt konstante Anteile
Gro-O-Schreibweise
Lineare Laufzeit
Die Anzahl der Operationen, die ein Algorithmus
durchfhrt, wchst linear mit der Anzahl der Werte.
Wird in Gro-O-Schreibweise als O(n) dargestellt
Gesprochen von der Ordnung n oder Ordnung n
Beispiel
berprfen, ob das erste Element eines n-Arrays mit
irgendeinem der anderen Elemente gleich ist.
Bentigt n - 1 Vergleiche
n Anteil dominiert, -1 wird ignoriert
Gro-O-Schreibweise
Quadratische Laufzeit
Die Anzahl der Operationen, die ein Algorithmus
durchfhrt, wchst quadratisch mit der Anzahl der Werte.
Wird in Gro-O-Schreibweise als O(n2) dargestellt
Gesprochen von der Ordnung n2 oder Ordnung n2
Beispiel
berprfen, ob irgendein Element eines n-Arrays mit
irgendeinem der anderen Elemente gleich ist.
Bentigt n2/2 n/2 Vergleiche
n2 Anteil dominiert, die Konstante 1/2 wird ignoriert,
-n/2 wird ignoriert
26 31 33 38 47 49 51 67 73 74 82 89 90 91 95
*
26 31 33 38 47 49 51 fig07_23.cpp
*
The integer 38 was found in position 3. (5 von 5)
26 31 33 38 47 49 51 67 73 74 82 89 90 91 95
*
73 74 82 89 90 91 95
*
90 91 95
*
The integer 91 was found in position 13.
26 31 33 38 47 49 51 67 73 74 82 89 90 91 95
*
26 31 33 38 47 49 51
*
26 31 33
*
26
*
The integer 25 was not found.
7.8.3 Insertion-Sort
Insertion-Sort
Einfach, fr groe Arrays nicht sehr effizient
Die erste Iteration nimmt das zweite Element.
Falls es kleiner als das erste Element ist, wird es mit dem
ersten Element vertauscht.
Die zweite Iteration betrachtet das dritte Element.
Es wird an die richtige Stelle des bereits sortierten Teilarrays
aus den ersten beiden Elementen gesetzt. Dadurch ist der
sortierte Bereich um ein Element grer.
In der i-ten Iteration dieses Algorithmus, sind die ersten i
Elemente des ursprnglichen Arrays sortiert.
7.8.3 Insertion-Sort
Beispiel
Unsortiertes Array
34 56 04 10 77 51 93 30 05 52
Erster Schritt (Vertauschen, falls erforderlich)
34 56
Einsetzen des dritten Elements an der passenden Stelle
34 56 04
34 56 04
34 56 04
04 34 56
Einsetzen des vierten Elements an der passenden Stelle
04 34 56 10
04 34 56 10
04 34 56 10
04 10 34 56 und so weiter...
Unsorted array:
34 56 4 10 77 51 93 30 5 52
Sorted array:
4 5 10 30 34 51 52 56 77 93
7.8.3 Insertion-Sort
Effizienz von Insertion-Sort
In der i-ten Iteration
wird das (i + 1)te Element in die korrekte Position in bezug
auf die ersten i Elemente gesetzt.
Nach der i-ten Iteration
sind die ersten i Elemente sortiert.
Die uere Schleife wird (n 1) mal durchlaufen.
Im ungnstigsten Fall wird die innere Schleife n mal
durchlaufen.
Damit ergibt sich O(n2).
Fr die Bestimmung des Gro-O-Wertes bedeuten
verschachtelte Wiederholungsanweisungen eine
Multiplikation der jeweiligen Anzahl der Iterationen.
7.8.4 Merge-Sort
Merge-Sort
Rekursive Implementierung
Basisfall
Ein vector mit einem Element ist schon sortiert.
Rekursionsschritt
Der vector (mit 2 Elementen) wird in zwei gleich
groe Hlften aufgeteilt.
Falls die vectorgre ungerade ist, wird ein
Teilvector ein Element grer als der andere.
Rekursives Sortieren jedes Teilvectors
Verschmelzen der Teilvectoren in einen groen,
sortierten vector.
7.8.4 Merge-Sort
Merge-Sort
Verschmelzung an einem Beispiel
Kleinere, sortierte Teilvectoren
A: 4 10 34 56 77
B: 5 30 51 52 93
Vergleich des kleinsten Elements in A mit dem kleinsten
Element in B
4 (A) ist kleiner als 5 (B)
4 wird das erste Element im verschmolzenen vector
5 (B) ist kleiner als 10 (A)
5 wird das zweite Element im verschmolzenen vector
10 (A) ist kleiner als 30 (B)
10 wird das dritte Element im verschmolzenen vector
usw.
split: 30 47 22
30 47
22
split: 30 47
30
47
merge: 30
47
30 47
merge: 30 47
22
22 30 47
split: 67 79
67
79
merge: 67
79
67 79
merge: 22 30 47
67 79
22 30 47 67 79
split: 18 60 78
18 60 fig07_27.cpp
78
(7 von 7)
split: 18 60
18
60
merge: 18
60
18 60
merge: 18 60
78
18 60 78
split: 26 54
26
54
merge: 26
54
26 54
merge: 18 60 78
26 54
18 26 54 60 78
merge: 22 30 47 67 79
18 26 54 60 78
18 22 26 30 47 54 60 67 78 79
Sorted vector:
18 22 26 30 47 54 60 67 78 79
7.8.4 Merge-Sort
Effizienz von Merge-Sort
O(n log n) Laufzeit:
Das Halbieren der vectoren bedeutet log2 n Ebenen, um den
Basisfall zu erreichen.
Verdopplung der vectorgre erfordert eine weitere
Ebene, vervierfachen zwei weitere Ebenen usw.
O(n) Vergleiche sind auf jeder Ebene erforderlich:
Aufruf von sortSubVector mit einem vector der
Gre n fhrt zu
Zweimal sortSubVector mit Teilvectoren der
Gre n/2
merge mit n 1 (Ordnung n) Vergleichen
Damit ergibt sich insgesamt O(n log n)
Algorithmus Komplexitt
Bubble-Sort O(n2)
Selection-Sort O(n2)
Insertion-Sort O(n2)
Merge-Sort O(n log n)
Genherter
n O(log n) O(n) O(n log n) O(n2)
Dezimalwert
Zweidimensionale Arrays
Matrix oder Tabelle
Werte, die in Zeilen und Spalten angeordnet sind
Elemente werden ber zwei Indices a[ i ][ j ]
angesprochen
Ein Array mit m Zeilen und n Spalten wird als m-mal-n
Array bezeichnet.
Mehrdimensionale Arrays knnen mehr als zwei
Dimensionen haben
Jede weitere Dimension fhrt zu einem zustzlichen Index:
a[ i ][ j ][ k ] usw.
Hufiger Programmierfehler
Fig.7.30 | Zweidimensionales Array mit drei Zeilen (rows) und vier Spalten (columns).
Lowest grade is 65
Highest grade is 100