Implementierungen von Sortieralgorithmen in Python

Einführung in Sortieralgorithmen

Das Sortieren von Daten ist eine grundlegende Aufgabe in der Programmierung. Die Effizienz eines Sortieralgorithmus ist entscheidend für die Performance einer Anwendung. Ein ineffizienter Algorithmus kann bei großen Datenmengen zu erheblichen Verzögerungen führen. In diesem Artikel untersuchen wir verschiedene Sortieralgorithmen und deren Implementierungen.

Wir werden verschiedene Sortierverfahren Schritt für Schritt erläutern und in Python implementieren. Diese Implementierungen können leicht in andere Programmiersprachen übertragen werden, sobald das Grundprinzip des jeweiligen Algorithmus verstanden wurde. Wir beginnen mit den weniger effizienten Algorithmen und arbeiten uns zu den schnelleren Methoden vor.

Lassen Sie uns nun in die Welt der Sortieralgorithmen eintauchen.

Sortieren durch Einfügen (Insertion Sort)

Insertion Sort ist ein einfacher Sortieralgorithmus, der sich leicht implementieren lässt. Er ist jedoch nicht die beste Wahl für große Datenmengen, da seine Laufzeit mit der Größe der Eingabe quadratisch ansteigt. Das Prinzip von Insertion Sort besteht darin, das Array in einen sortierten und einen unsortierten Bereich zu unterteilen. Der Algorithmus nimmt dann sukzessive Elemente aus dem unsortierten Bereich und fügt sie an der richtigen Position in den sortierten Bereich ein.

Anfangs enthält der sortierte Bereich nur das erste Element des Arrays. Bei jeder Iteration wird das nächste Element aus dem unsortierten Bereich genommen und so lange nach links verschoben, bis die richtige Position im sortierten Bereich gefunden ist.

Hier ist eine Schritt-für-Schritt-Anleitung zur Implementierung von Insertion Sort:

  • Initialisieren Sie ein Array mit Testdaten (Integer).
  • Beginnen Sie mit der Iteration ab dem zweiten Element des Arrays.
    • Speichern Sie die aktuelle Position und das aktuelle Element in separaten Variablen.
    • Starten Sie eine innere Schleife, die solange läuft, bis der Anfang des Arrays erreicht ist oder ein Element gefunden wird, das kleiner als das aktuelle Element ist.
      • Verschieben Sie das Element an der aktuellen Position um eine Position nach rechts.
      • Dekrementieren Sie die aktuelle Position.
    • Platzieren Sie das aktuelle Element an der neu gefundenen Position.

Die Zeitkomplexität von Insertion Sort beträgt O(n^2), und die Raumkomplexität beträgt O(1).

Hier ist der Python-Code für Insertion Sort:

def insertion_sort(arr, n):
  for i in range(1, n):
   current_position = i
   current_element = arr[i]
   while current_position > 0 and current_element < arr[current_position - 1]:
    arr[current_position] = arr[current_position - 1]
    current_position -= 1
   arr[current_position] = current_element

if __name__ == '__main__':
  arr = [3, 4, 7, 8, 1, 9, 5, 2, 6]
  insertion_sort(arr, 9)
  print(str(arr))

Sortieren durch Auswahl (Selection Sort)

Selection Sort ist ein weiterer einfacher Sortieralgorithmus, der ähnlich wie Insertion Sort funktioniert. Auch hier wird das Array in einen sortierten und einen unsortierten Teil aufgeteilt. Bei jeder Iteration wird das kleinste Element aus dem unsortierten Teil gesucht und mit dem Element am Ende des sortierten Teils vertauscht.

Hier sind die Schritte zur Implementierung von Selection Sort:

  • Initialisieren Sie das Array mit Testdaten (Integer).
  • Iterieren Sie über das Array.
    • Speichern Sie den Index des minimalen Elements.
    • Starten Sie eine innere Schleife, die von der aktuellen Position bis zum Ende des Arrays läuft.
      • Überprüfen Sie, ob das aktuelle Element kleiner als das minimale Element ist.
      • Wenn ja, aktualisieren Sie den Index des minimalen Elements.
    • Tauschen Sie das aktuelle Element mit dem minimalen Element.

Die Zeitkomplexität von Selection Sort ist ebenfalls O(n^2), und die Raumkomplexität beträgt O(1).

Hier ist der Python-Code für Selection Sort:

def selection_sort(arr, n):
  for i in range(n):
   min_element_index = i
   for j in range(i + 1, n):
    if arr[j] < arr[min_element_index]:
     min_element_index = j
   arr[i], arr[min_element_index] = arr[min_element_index], arr[i]

if __name__ == '__main__':
  arr = [3, 4, 7, 8, 1, 9, 5, 2, 6]
  selection_sort(arr, 9)
  print(str(arr))

Blasensortierung (Bubble Sort)

Bubble Sort ist ein sehr einfacher, aber ineffizienter Sortieralgorithmus. Er vergleicht und tauscht benachbarte Elemente wiederholt, bis das Array vollständig sortiert ist. Das Array wird mehrmals durchlaufen, wobei bei jedem Durchlauf benachbarte Elemente verglichen und gegebenenfalls getauscht werden, um größere Elemente „nach oben“ zu befördern.

Die Schritte zur Implementierung von Bubble Sort sind wie folgt:

  • Initialisieren Sie ein Array mit Testdaten (Integer).
  • Iterieren Sie über das Array.
  • Starten Sie eine innere Schleife, die von 0 bis n-i-1 läuft (die letzten i Elemente sind bereits sortiert).
  • Vergleichen Sie benachbarte Elemente.
  • Tauschen Sie die Elemente, wenn das aktuelle Element größer als das nächste ist.

Die Zeitkomplexität von Bubble Sort ist O(n^2), und die Raumkomplexität beträgt O(1).

Hier ist der Python-Code für Bubble Sort:

def bubble_sort(arr, n):
  for i in range(n):
   for j in range(n - i - 1):
    if arr[j] > arr[j + 1]:
     arr[j], arr[j + 1] = arr[j + 1], arr[j]

if __name__ == '__main__':
  arr = [3, 4, 7, 8, 1, 9, 5, 2, 6]
  bubble_sort(arr, 9)
  print(str(arr))

Mergesort

Mergesort ist ein effizienter, rekursiver Sortieralgorithmus, der dem „Teile und Herrsche“-Prinzip folgt. Er teilt das Array rekursiv in zwei Hälften, bis die Subarrays nur noch ein Element enthalten (die trivial sortiert sind). Dann werden die sortierten Subarrays wieder zusammengeführt.

Die Schritte zur Implementierung von Mergesort sind wie folgt:

  • Initialisieren Sie ein Array mit Testdaten (Integer).
  • Schreiben Sie eine Funktion `merge`, um zwei sortierte Subarrays in ein einziges sortiertes Array zusammenzuführen. Die Funktion akzeptiert das Array sowie linke, mittlere und rechte Indizes als Argumente.
    • Berechnen Sie die Längen der linken und rechten Subarrays.
    • Kopieren Sie die Elemente aus dem Array in die entsprechenden linken und rechten Arrays.
    • Iterieren Sie über die zwei Subarrays.
      • Vergleichen Sie die Elemente der beiden Subarrays.
      • Fügen Sie das kleinere Element dem Array hinzu.
    • Fügen Sie alle verbleibenden Elemente aus beiden Subarrays hinzu.
  • Schreiben Sie eine rekursive Funktion `merge_sort` mit Parametern Array, linker und rechter Index.
    • Wenn der linke Index größer oder gleich dem rechten Index ist, beenden Sie die Funktion.
    • Finden Sie den Mittelpunkt des Arrays.
    • Rufen Sie `merge_sort` rekursiv mit den linken, rechten und mittleren Indizes auf.
    • Führen Sie das Array nach den rekursiven Aufrufen mit der `merge`-Funktion zusammen.

Die Zeitkomplexität von Mergesort beträgt O(n log n), und die Raumkomplexität beträgt O(n).

Hier ist der Python-Code für Mergesort:

def merge(arr, left_index, mid_index, right_index):
  left_array = arr[left_index:mid_index+1]
  right_array = arr[mid_index+1:right_index+1]
  left_array_length = mid_index - left_index + 1
  right_array_length = right_index - mid_index
  i = j = 0
  k = left_index
  while i < left_array_length and j < right_array_length:
   if left_array[i] < right_array[j]:
    arr[k] = left_array[i]
    i += 1
   else:
    arr[k] = right_array[j]
    j += 1
   k += 1
  while i < left_array_length:
   arr[k] = left_array[i]
   i += 1
   k += 1
  while j < right_array_length:
   j += 1
   k += 1
def merge_sort(arr, left_index, right_index):
  if left_index >= right_index:
   return
  mid_index = (left_index + right_index) // 2
  merge_sort(arr, left_index, mid_index)
  merge_sort(arr, mid_index + 1, right_index)
  merge(arr, left_index, mid_index, right_index)

if __name__ == '__main__':
  arr = [3, 4, 7, 8, 1, 9, 5, 2, 6]
  merge_sort(arr, 0, 8)
  print(str(arr))

Zusammenfassung

In diesem Artikel haben wir einige grundlegende Sortieralgorithmen behandelt. Es gibt viele weitere Sortieralgorithmen, aber die hier gezeigten sind oft die ersten, die man in der Informatik kennenlernt. Ich hoffe, dass dieser Artikel Ihr Verständnis der Sortieralgorithmen erweitert hat.

Als Nächstes können Sie sich über Suchalgorithmen informieren.

Viel Spaß beim Programmieren! 👨‍💻