Kamm-Sortierung

Harshit Jindal 12 Oktober 2023
  1. Kamm-Sortieralgorithmus
  2. Kamm-Sortier-Beispiel
  3. Implementierung des Kamm-Sortieralgorithmus
  4. Kamm-Sortieralgorithmus Komplexität
Kamm-Sortierung

Kamm-Sortierung ist ein einfacher vergleichsbasierter Sortieralgorithmus. Er ist eine verbesserte Form von Blasensortierung. Bei Bubble Sort werden benachbarte Elemente in jedem Durchgang/Phase verglichen und Invertierungen nacheinander entfernt. Kamm-Sortierung hingegen beginnt mit einer großen Lücke und reduziert diese jedes Mal um einen Verkleinerungsfaktor von 1,3. Comb Sort kann mehrere Invertierungen mit nur einem Swap entfernen. Es basiert auf der Idee des Tötens der Schildkröten. Turtles sind die kleinen Elemente gegen Ende der Liste, die die Effizienz von Bubble Sort verringern, und das Töten dieser Elemente verbessert die Sortierleistung erheblich.

Kamm-Sortieralgorithmus

Nehmen wir an, dass wir ein unsortiertes Array A[] mit n Elementen haben. Wir nehmen den Schrumpfungsfaktor 1,3 an, weil er empirisch gesehen die besten Ergebnisse liefert.

  • Initialisieren Sie die Variable gap als die Größe des Arrays und die Variable swapped als true.
  • Deklarieren Sie die konstante Variable SHRINK_FACTOR als 1.3.
  • Während gap nicht 1 ist oder swapped auf true gesetzt ist, führen Sie Folgendes aus:
    • Set swapped as false.
    • Set gap as (int)gap/SHRINK_FACTOR.
    • For every element in the range 0 to n - gap do the following - if A[i] > A[i+gap], swap(A[i], A[i+gap]) and set swapped to true.

Kamm-Sortier-Beispiel

Angenommen, wir haben das Array: (3, 5, 2, 8, 1, 7, 6, 4). Wir werden es mit dem Kamm-Sortieralgorithmus sortieren.

Initialisieren Sie gap=8 , swapped=true und SHRINK_FACTOR = 1.3.

  • Der erste Durchlauf

gap = 8 / 1.3 = 6, swapped = false

Iteration (3, 5, 2, 8, 1, 7, 6, 4) Aktion
i = 0 (3, 5, 2, 8, 3, 7, 6, 4) 3 < 6, kein Tausch
i = 1 (3, 4, 2, 8, 1, 7, 6, 5) 5 > 4, Vertauscht
  • Der zweite Durchlauf

gap = 6 / 1.3 = 4, swapped = false

Iteration (3, 4, 2, 8, 1, 7, 6, 5) Aktion
i = 0 (1, 4, 2, 8, 3, 7, 6, 5) 3 > 1, vertauscht
i = 1 (1, 4, 2, 8, 3, 7, 6, 5) 4 < 7, kein Tausch
i = 2 (1, 4, 2, 8, 3, 7, 6, 5) 2 < 6, kein Tausch
i = 3 (1, 4, 2, 5, 3, 7, 6, 8) 8 > 5, Vertauscht
  • Der dritte Durchlauf

gap = 4 / 1.3 = 3, swapped = false

Iteration (1, 4, 2, 5, 3, 7, 6, 8) Aktion
i = 0 (1, 4, 2, 5, 3, 7, 6, 8) 1 < 5, kein Tausch
i = 1 (1, 3, 2, 5, 4, 7, 6, 8) 4 > 3, Vertauscht
i = 2 (1, 3, 2, 5, 4, 7, 6, 8) 2 < 7, kein Tausch
i = 3 (1, 3, 2, 5, 4, 7, 6, 8) 5 < 6, kein Tausch
i = 4 (1, 3, 2, 5, 4, 7, 6, 8) 4 < 8, keine Vertauschung
  • Der vierte Durchgang

gap = 3 / 1.3 = 2, swapped = false

Iteration (1, 3, 2, 5, 4, 7, 6, 8) Aktion
i = 0 (1, 3, 2, 5, 4, 7, 6, 8) 1 < 2, kein Tausch
i = 1 (1, 3, 2, 5, 4, 7, 6, 8) 3 < 5, kein Tausch
i = 2 (1, 3, 2, 5, 4, 7, 6, 8) 2 < 4, kein Tausch
i = 3 (1, 3, 2, 5, 4, 7, 6, 8) 5 < 7, kein Tausch
i = 4 (1, 3, 2, 5, 4, 7, 6, 8) 4 < 6, kein Tausch
i = 5 (1, 3, 2, 5, 4, 7, 6, 8) 7 < 8, keine Vertauschung
  • Der fünfte Durchgang

gap = 2 / 1.3 = 1, swapped = false

Iteration (1, 3, 2, 5, 4, 7, 6, 8) Aktion
i = 0 (1, 3, 2, 5, 4, 7, 6, 8) 1 < 3, kein Tausch
i = 1 (1, 2, 3, 5, 4, 7, 6, 8) 3 > 2, Vertauscht
i = 2 (1, 2, 3, 5, 4, 7, 6, 8) 3 < 5, kein Tausch
i = 3 (1, 2, 3, 4, 5, 7, 6, 8) 5 > 4, Vertauscht
i = 4 (1, 2, 3, 4, 5, 7, 6, 8) 5 < 7, kein Tausch
i = 5 (1, 2, 3, 5, 4, 6, 7, 8) 7 > 6, Vertauscht
i = 6 (1, 2, 3, 4, 5, 6, 7, 8) 7 < 8, kein Tausch

Wir erhalten das endgültige sortierte Array als: (1, 2, 3, 4, 5, 6, 7, 8).

Implementierung des Kamm-Sortieralgorithmus

#include <iostream>
using namespace std;

int updateGap(int gap) {
  gap = (gap * 10) / 13;
  if (gap < 1)
    return 1;
  else
    return gap;
}

void combSort(int arr[], int n) {
  int gap = n;
  bool swapped = true;
  while (gap > 1 || swapped == true) {
    gap = updateGap(gap);
    swapped = false;
    for (int i = 0; i < (n - gap); i++) {
      int temp;
      if (arr[i] > arr[i + gap]) {
        temp = arr[i];
        arr[i] = arr[i + gap];
        arr[i + gap] = temp;
        swapped = true;
      }
    }
  }
}

int main() {
  int n = 6;
  int arr[6] = {5, 3, 4, 2, 1, 6};
  cout << "Input array: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
  combSort(arr, n);
  cout << "Output array: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
}

Kamm-Sortieralgorithmus Komplexität

Zeitkomplexität

  • Durchschnittlicher Fall

Die Zeitkomplexität liegt in der Größenordnung von [Big Theta]: O(n2/2p), wobei p die Anzahl der Inkremente ist.

  • Schlechtester Fall

Die Zeitkomplexität im ungünstigsten Fall ist [Big O]: O(n2).

  • Bester Fall

Der Best-Case tritt auf, wenn das Array bereits sortiert oder fast sortiert ist. Die Zeitkomplexität im besten Fall ist [Big Omega]: O(nlogn). Das ist eine deutliche Verbesserung gegenüber der Best-Case-Zeitkomplexität von Blasensortierung.

Raumkomplexität

Die Platzkomplexität für diesen Algorithmus ist O(n), da der Kamm-Sortieralgorithmus außer temporären Variablen keinen zusätzlichen Platz benötigt.

Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn

Verwandter Artikel - Sort Algorithm