Sortieren
Aufgabe
In der Vorlesung (und in den Shorts dazu) haben wir uns einige Algorithmen zum Sortieren einer Zahlenfolge angeschaut: Selection Sort, Bubble Sort und Merge Sort.
Zur Erinnerung:
- Selection Sort durchläuft die unsortierten Teile einer Liste, wählt jedes Mal das kleinste Element aus und verschiebt es an seine richtige Stelle.
- Bubble Sort vergleicht Paare benachbarter Werte nacheinander und vertauscht sie, wenn sie in der falschen Reihenfolge sind. Dies wird so lange fortgesetzt, bis die Liste sortiert ist.
- Merge Sort teilt die Liste rekursiv in zwei Teile und fügt die kleineren Listen in der richtigen Reihenfolge wieder zu einer größeren zusammen.
In dieser Aufgabe werden Sie drei (kompilierte!) Sortierprogramme analysieren, um herauszufinden, welche Algorithmen jeweils verwendet werden.
Halten Sie Ihre Antworten zusammen mit einer Erklärung für jedes Programm in einer Datei namens answers.txt
in einem Ordner namens sort
fest, indem Sie die mit TODO
markierten Leerstellen ausfüllen. Diese TODO
s finden Sie in der Datei answers.txt
, die Sie zusammen mit den kompilierten Programmen herunterladen. Beachten Sie hierzu die Hinweise unter Aufgabenmaterial.
Aufgabenmaterial
Für diese Aufgabe benötigen Sie Programme, die von uns zur Verfügung gestellt werden. Sie erhalten drei bereits kompilierte C-Programme, sort1
, sort2
und sort3
, sowie mehrere .txt
-Dateien zur Eingabe und eine weitere Datei, answers.txt
, in die Sie Ihre Antworten schreiben können. In sort1
, sort2
und sort3
ist jeweils ein anderer Sortieralgorithmus implementiert: Selection Sort, Bubble Sort und Merge Sort (allerdings nicht unbedingt in dieser Reihenfolge). Ihre Aufgabe ist es, herauszufinden, welcher Sortieralgorithmus in welchem Programm verwendet wird.
Aufgabenmaterial herunterladen
Öffnen Sie VS Code entsprechend Ihrem Setup.
Öffnen Sie Ihr Terminalfenster und führen Sie dann cd
aus. Die Eingabeaufforderung Ihres Terminalfensters sollte wie folgt aussehen:
$
Geben Sie dann
wget https://inf.zone/download/exercises/03/sort.zip
ein und führen Sie den Befehl mit der Eingabetaste aus, um eine ZIP-Datei namens sort.zip
in den aktuellen Ordner herunterzuladen. Achten Sie darauf, dass Sie das Leerzeichen zwischen wget
und der folgenden URL nicht übersehen, und auch kein anderes Zeichen!
Führen Sie jetzt
unzip sort.zip
aus, um das ZIP-Archiv in einen Ordner namens sort
zu extrahieren. Sie brauchen die ZIP-Datei nicht mehr, also können Sie
rm sort.zip
ausführen. Antworten Sie mit “y”, gefolgt von der Eingabetaste, um die heruntergeladene ZIP-Datei zu entfernen. Führen Sie dann
cd sort
aus, um in dieses Verzeichnis zu wechseln. Ihre Eingabeaufforderung sollte nun wie folgt aussehen:
sort/ $
Hilfestellung
Klicken Sie auf die folgenden Tipps, um einige Ratschläge zu erhalten!
Untersuchen Sie die .txt
-Dateien
- Es werden Ihnen mehrere
.txt
-Dateien zur Verfügung gestellt. Diese Dateien enthaltenn
Zeilen mit Werten, die entweder umgedreht, gemischt oder sortiert sind.- Zum Beispiel enthält
reversed10000.txt
10000 Zeilen mit Zahlen, deren Sortierung umgedreht ist (also von10000
zu1
sortiert, statt von1
zu10000
), währendrandom50000.txt
50000 Zeilen mit Zahlen in zufälliger Reihenfolge enthält.
- Zum Beispiel enthält
- Die verschiedenen Arten von
.txt
-Dateien können Ihnen helfen, die richtige Sortierung zu finden. Überlegen Sie, wie die einzelnen Algorithmen bei einer bereits sortierten Liste abschneiden. Wie bei einer umgekehrten Liste? Oder einer gemischten Liste? Es kann hilfreich sein, eine kleinere Liste jedes Typs durchzuarbeiten und jeden Sortiervorgang zu durchlaufen.
Messen Sie die Zeit für jede Sortierung mit verschiedenen Eingaben
- Um die Textdateien zu sortieren, führen Sie im Terminal
./[Programmname] [Textdatei.txt]
aus. Stellen Sie sicher, dass Siecd
benutzt haben, um in das Verzeichnissort
zu wechseln!- Um zum Beispiel
reversed10000.txt
mitsort1
zu sortieren, führen Sie./sort1 reversed10000.txt
aus.
- Um zum Beispiel
- Es ist sinnvoll, die für die Sortierung benötigte Zeit zu messen. Dazu führen Sie
time ./[sort_file] [text_file.txt]
aus.- Zum Beispiel könnten Sie mit
time ./sort1 reversed10000.txt
die Zeit messen, diesort1
benötigt, um 10.000 umgekehrt sortierte Zahlen zu sortieren. Am Ende der Ausgabe Ihres Terminals können Sie unterreal
die “echte” Zeit sehen, die bei der Ausführung des Programms tatsächlich verstrichen ist.
- Zum Beispiel könnten Sie mit
Strg+Shift+C
und Strg+Shift+V
(bei Windows, ansonsten rechter Mausklick in das Terminalfenster) kann man Text in die Kommandozeile kopieren. Zuvor genutzte Befehle kann man mit den Pfeiltasten (hoch/runter) oder Strg+R
erneut aufrufen.
Testen
Korrektheit
Führen Sie in Ihrem Terminal den folgenden Befehl aus, um die Korrektheit Ihrer Arbeit zu überprüfen:
check50 -l cs50/problems/2024/x/sort