In diesem Labor werden Sie:
Implementieren Sie den Bubble Sort Algorithmus, um ein Array aufsteigend zu sortieren.
Vergleiche benachbarte Elemente und tausche sie, wenn sie in falscher Reihenfolge sind. Wiederhole, bis keine Tausche mehr nötig sind.
{64, 34, 25, 12, 22, 11, 90}Zeit: O(n²) - zwei verschachtelte Schleifen
Speicher: O(1) - nur eine temp-Variable für Swap
#include <stdio.h> void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { // Nach jedem Durchgang ist das größte Element am Ende for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) { // Tausche int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = 7; printf("Unsortiert: "); printArray(arr, n); bubbleSort(arr, n); printf("Sortiert: "); printArray(arr, n); return 0; }
Implementieren Sie den Selection Sort Algorithmus.
Finde das Minimum im unsortierten Teil und tausche es an die richtige Position.
#include <stdio.h> void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } void selectionSort(int arr[], int n, int *vergleiche, int *tausche) { *vergleiche = 0; *tausche = 0; for (int i = 0; i < n - 1; i++) { // Finde Index des Minimums im unsortierten Teil int minIdx = i; for (int j = i + 1; j < n; j++) { (*vergleiche)++; if (arr[j] < arr[minIdx]) { minIdx = j; } } // Tausche nur wenn nötig if (minIdx != i) { int temp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = temp; (*tausche)++; } } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = 7; int vergleiche, tausche; printf("Unsortiert: "); printArray(arr, n); selectionSort(arr, n, &vergleiche, &tausche); printf("Sortiert: "); printArray(arr, n); printf("Vergleiche: %d\n", vergleiche); printf("Tausche: %d\n", tausche); return 0; }
Vergleichen Sie Bubble Sort und Selection Sort anhand der Anzahl der Operationen.
#include <stdio.h> #include <stdlib.h> #include <time.h> void printArray(int arr[], int n) { for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); } void copyArray(int src[], int dest[], int n) { for (int i = 0; i < n; i++) dest[i] = src[i]; } void bubbleSort(int arr[], int n, int *vgl, int *swp) { *vgl = 0; *swp = 0; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { (*vgl)++; if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; (*swp)++; } } } } void selectionSort(int arr[], int n, int *vgl, int *swp) { *vgl = 0; *swp = 0; for (int i = 0; i < n - 1; i++) { int minIdx = i; for (int j = i + 1; j < n; j++) { (*vgl)++; if (arr[j] < arr[minIdx]) minIdx = j; } if (minIdx != i) { int temp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = temp; (*swp)++; } } } int main() { srand(time(NULL)); int n = 10; int original[10], arr1[10], arr2[10]; int vgl1, swp1, vgl2, swp2; // Zufallszahlen generieren for (int i = 0; i < n; i++) { original[i] = rand() % 100; } printf("Original: "); printArray(original, n); // Kopien erstellen copyArray(original, arr1, n); copyArray(original, arr2, n); // Sortieren bubbleSort(arr1, n, &vgl1, &swp1); selectionSort(arr2, n, &vgl2, &swp2); // Ergebnisse ausgeben printf("\nAlgorithmus | Vergleiche | Tausche\n"); printf("-----------------|------------|--------\n"); printf("Bubble Sort | %2d | %2d\n", vgl1, swp1); printf("Selection Sort | %2d | %2d\n", vgl2, swp2); return 0; }
Implementieren Sie die lineare Suche und zählen Sie die Vergleiche.
Gehe Element für Element durch, bis du das gesuchte findest (oder das Ende erreichst).
{15, 27, 3, 42, 8, 91, 56, 12, 77, 33}#include <stdio.h> int linearSearch(int arr[], int n, int target, int *vergleiche) { *vergleiche = 0; for (int i = 0; i < n; i++) { (*vergleiche)++; if (arr[i] == target) { return i; // Gefunden! } } return -1; // Nicht gefunden } void sucheUndZeige(int arr[], int n, int target) { int vergleiche; int index = linearSearch(arr, n, target, &vergleiche); printf("Suche nach %d: ", target); if (index != -1) { printf("Gefunden an Index %d (%d Vergleiche)\n", index, vergleiche); } else { printf("Nicht gefunden (%d Vergleiche)\n", vergleiche); } } int main() { int arr[] = {15, 27, 3, 42, 8, 91, 56, 12, 77, 33}; int n = 10; sucheUndZeige(arr, n, 42); sucheUndZeige(arr, n, 33); sucheUndZeige(arr, n, 100); return 0; }
Implementieren Sie die binäre Suche für ein sortiertes Array.
Halbiere das Suchintervall in jedem Schritt. Funktioniert nur bei sortierten Arrays!
Binäre Suche funktioniert NUR bei sortierten Arrays! Sortieren Sie das Array zuerst, falls nötig.
{3, 8, 12, 15, 27, 33, 42, 56, 77, 91}| Algorithmus | Best Case | Worst Case | 1000 Elemente |
|---|---|---|---|
| Lineare Suche | O(1) | O(n) | 1000 Vergleiche |
| Binäre Suche | O(1) | O(log n) | ~10 Vergleiche |
#include <stdio.h> int binarySearch(int arr[], int n, int target, int *vergleiche) { *vergleiche = 0; int left = 0; int right = n - 1; while (left <= right) { (*vergleiche)++; int mid = left + (right - left) / 2; // Vermeidet Overflow if (arr[mid] == target) { return mid; // Gefunden! } else if (arr[mid] < target) { left = mid + 1; // Suche rechts } else { right = mid - 1; // Suche links } } return -1; // Nicht gefunden } void sucheUndZeige(int arr[], int n, int target) { int vergleiche; int index = binarySearch(arr, n, target, &vergleiche); printf("Binäre Suche nach %d: ", target); if (index != -1) { printf("Gefunden an Index %d (%d Vergleiche)\n", index, vergleiche); } else { printf("Nicht gefunden (%d Vergleiche)\n", vergleiche); } } int main() { // WICHTIG: Array muss sortiert sein! int arr[] = {3, 8, 12, 15, 27, 33, 42, 56, 77, 91}; int n = 10; printf("Sortiertes Array: "); for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n\n"); sucheUndZeige(arr, n, 42); sucheUndZeige(arr, n, 33); sucheUndZeige(arr, n, 100); printf("\nVergleich mit linearer Suche:\n"); printf("- Linear: bis zu %d Vergleiche\n", n); printf("- Binär: maximal ~4 Vergleiche (log2(%d))\n", n); return 0; }
Schreiben Sie ein Programm, das ein unsortiertes Array sortiert und dann binär durchsucht.
{72, 11, 45, 3, 88, 29, 67, 5, 99, 14}#include <stdio.h> void printArray(int arr[], int n) { for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); } void selectionSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int minIdx = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIdx]) minIdx = j; } if (minIdx != i) { int temp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = temp; } } } int binarySearch(int arr[], int n, int target, int *vergleiche) { *vergleiche = 0; int left = 0, right = n - 1; while (left <= right) { (*vergleiche)++; int mid = left + (right - left) / 2; if (arr[mid] == target) return mid; else if (arr[mid] < target) left = mid + 1; else right = mid - 1; } return -1; } void sucheUndZeige(int arr[], int n, int target) { int vergleiche; int index = binarySearch(arr, n, target, &vergleiche); printf("Binäre Suche nach %d: ", target); if (index != -1) { printf("Gefunden! Index %d (%d Vergleiche)\n", index, vergleiche); } else { printf("Nicht gefunden (%d Vergleiche)\n", vergleiche); } } int main() { int arr[] = {72, 11, 45, 3, 88, 29, 67, 5, 99, 14}; int n = 10; printf("Unsortiert: "); printArray(arr, n); // Erst sortieren selectionSort(arr, n); printf("Sortiert: "); printArray(arr, n); printf("\n"); // Dann binär suchen sucheUndZeige(arr, n, 45); sucheUndZeige(arr, n, 88); sucheUndZeige(arr, n, 50); return 0; }
| Algorithmus | Komplexität | Besonderheit |
|---|---|---|
| Bubble Sort | O(n²) | Einfach zu verstehen, viele Tausche |
| Selection Sort | O(n²) | Weniger Tausche als Bubble Sort |
| Lineare Suche | O(n) | Funktioniert immer, langsam bei großen Arrays |
| Binäre Suche | O(log n) | Sehr schnell, aber Array muss sortiert sein! |