Folien KGÜ 7

Grundgebiete der Informatik 1 - WS 14/15
Kleingruppenübung
Nr. 7
1
•
•
Heap-Sort
Listen
Fragen, Kritik oder Anregungen an lheim@ukaachen.de
Heap-Sort
❖
❖
❖
Idee: Selection-Sort verbessern
❖ Minimumsauswahl sehr umständlich
❖ Durchsuchung des gesamten Arrays
Lösung: Nutzung der Heap-Struktur
❖ Minimum kann schneller gefunden werden
Achtung!
❖ Hier vorgestellte Version des Algorithmus sortiert absteigend
❖ Kann nach Wunsch durch einfaches Invertieren korrigiert
werden
2
Heap-Struktur
Sortierverfahren interpretiert Daten-Array als Binärbaum
Array im Speicher:
❖
❖
Interpretation durch Heap-Sort
3
Minimums Heap
Definition (Heap):
❖ Ein Heap ist ein Binärbaum, dessen Elemente in einer
bestimmten Weise geordnet sind.
❖
Kriterien für einen Minimums-Heap:
4
Prinzip des Heap-Sorts
❖
❖
❖
Versinken von Elementen im Heap (sink-Funktion)
Fortgesetztes Vertauschen von Elementen mit kleinerem der
beiden Söhne
Beispiel: Wurzel einsinken lassen
5
Prinzip des Heap-Sorts
1) Vorbereitung: Aufbau eines Minimus-Heaps mithilfe der sink-Funktion
❖ Nacheinander Elemente des Arrays einsinken lassen
❖ Hinten beginnn und nach vorne durchgehen
❖ Array ist jetzt Minimums-Heap
❖ Minimum befinde sich am Array-Anfang
2) Wiederholen bis Array komplett sortiert:
❖ Minimum (= erstes Element) am Ende des Arrays tauschen
❖ Zweiter Teil (fertig sortierter Teil) wird nicht mehr als Teil des
Heaps betrachtet
❖ Erster Teil ist durch Tausch kein Minimums-Heap mehr
❖ Wiederherstellen des Heaps durch Einsinken der neuen Wurzel
6
Heap-Sort Code
7
Hilfsfunktion Sink Code
8
Heap-Sort Stabilität
NICHT STABIL!
❖ Tausch mit „unten rechts“, wenn sortiert
❖ Gegenbeispiel:
9
Heap-Sort Laufzeit
Laufzeitkomplexität immer
O(n log n)
auch im „worst case“
10
Verkettete Listen
❖
Schnelle Verarbeitung von großen Datenmengen sehr wichtig
in der Informatik
❖
Probleme bei Arrays
❖
❖
Statische Größe
❖
Verschieben und Einfügen von Elementen sehr aufwendig
Lösung: Reihe von Zeigern auf dem Heap-Speicher
❖
Liste: zwei Zeiger auf das erste und letzte Element
❖
Knotenstruktur
11
Speicher
❖
Stack
❖
❖
❖
Stapelspeicher für lokale Variablen eines Moduls
Heap
❖
kann zur Laufzeit verändert werden (dynamisch)
❖
Daten können erstellt, aber auch gelöscht werden
Static Storage
❖
statische und globale Variablen
genauer: http://stackoverflow.com/a/409072
12
Verkette Listen - Idee
❖
Jedes Element speichert neben seinen eigenen Daten
einen Zeiger auf das nächste Element
13
Listenelement und Liste
14
Liste initialisieren
objZeiger->element entspricht (*objZeiger).element
15
Leerheitstest
int IsEmpty(List L)
{
return (L.first == NULL &&
L.last == NULL);
}
❖
Wann wird was zurückgegeben?
❖
0 wenn mindestens einer der beiden Zeiger kein NullZeiger
❖
1 wenn beide Zeiger NULL-Zeiger sind
16
Neuen Knoten anlegen
❖
❖
❖
Verwende malloc
❖
Malloc-Funktion stellt Speicher auf dem Heap bereit
❖
#include <stdlib.h>
Verwendung:
❖
Typ* zeiger = (Typ*)malloc(sizeof(Datensatz));
❖
Liefert den void-Zeiger auf Anfang des freien Speicherbereichs
mit der gewünschten Größe
❖
NULL-Zeiger, wenn Speicher voll
Per Typecast erhält Zeiger den entsprechenden Typ
17
Neuen Knoten anlegen
18
Listenoperationen
❖
Einfügen am Listenanfang (appendFirst)
❖
Einfügen am Listenende (appendLast)
❖
Einfügen hinter einem Element (insertBehind)
❖
Einfügen vor einem Element (insertBefore)
❖
Löschen (delete)
❖
Prüfen ob Element vorhanden ist (IsIn)
❖
Zusammenfügen von Listen (union)
❖
Schnittmenge (intersect)
19
Aufgabe 7.P.b Teilaufgabe 2
nach Ausführung aller Anweisung außer der return Anweisung
Stack
Heap
static storage
p.name = “HDL"
name = “HDL”
l.first
p.mitglieder =
25000
mitglieder = 25000
l.last
int main() {
p.stimmen = 27.8 stimmen = 27.8
next = null
name = “MFG”
}
mitglieder = 50000
stimmen = 40.3
next
Partei p;
init(&l);
strcpy(p.name, "MFG");
p.mitglieder = 50000;
p.stimmen = 40.3;
appendLast(p, &l);
strcpy(p.name, "HDL");
p.mitglieder = 25000;
p.stimmen = 27.8;
appendLast(p, &l);
return 0;
Grundgebiete der Informatik 1 - WS 14/15
Bis nächste Woche
nächste Woche:
• Bäume
• Such-u. Binärbäume
Fragen, Kritik oder Anregungen an lheim@ukaachen.de
21