Pfannkuchen sortieren

Harshit Jindal 12 Oktober 2023
  1. Pfannkuchen-Sortieralgorithmus
  2. Beispiel für Pfannkuchensortierung
  3. Implementierung des Pancake-Sortieralgorithmus
  4. Pancake-Sortieralgorithmus Komplexität
Pfannkuchen sortieren

Pfannkuchensortierung ist ein umkehrbasierter Sortieralgorithmus. Er basiert auf dem realen Problem, Pfannkuchen auf einem Teller mit Hilfe eines Spatels zu ähneln. Seinen Namen hat er von der im Algorithmus verwendeten Flip-Operation, die dem Wenden von Pfannkuchen ähnelt. Im Gegensatz zu den meisten Sortieralgorithmen, die versuchen, die Anzahl der für die Durchführung der Sortierung erforderlichen Vergleiche zu minimieren, versucht er, das Array in möglichst wenigen Umkehrungen zu sortieren. Genau wie selection sort platziert auch er das maximale Element an das Ende.

Pfannkuchen-Sortieralgorithmus

Nehmen wir an, dass wir ein unsortiertes Array A[] mit n Elementen haben.

PancakeSort()

  • Initialisieren Sie die Größe des unsortierten Unterarrays als curr = n-1 und reduzieren Sie seine Größe iterativ um 1.
  • Finden Sie den Index des maximalen Elements mi im unsortierten Subarray.
  • Flip A[0, ... , mi] mit flip(A,mi), um das maximale Element A[i] auf den Index 0 zu verschieben.
  • Flip A[0, ... , i] unter Verwendung von flip(A,i), um das maximale Element A[i] an seine korrekte Position zu verschieben.

Flip()

  • Vertausche das Element am ersten Index f mit dem am letzten Index e.
  • Inkrementieren Sie f und dekrementieren Sie e.
  • Wiederholen Sie die obigen Schritte, bis f <= e.

Beispiel für Pfannkuchensortierung

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

  • Erste Iteration

mi = 4, curr = 7

Flip(mi) [7, 1, 2, 5, 3, 6, 4]
Flip(6) [ 4, 6, 3, 5, 2, 1, 7]
  • Zweite Iteration

mi = 1, curr = 6

Flip(mi) [6, 4, 3, 5, 2, 1, 7]
Flip(5) [1, 2, 5, 3, 4, 6, 7]
  • Dritte Iteration

mi = 2, curr = 5

Flip(mi) [5, 2, 1, 3, 4, 6, 7]
Flip(4) [4, 3, 1, 2, 5, 6, 7]
  • Vierte Iteration

mi = 0, curr = 4

Flip(mi) [4, 3, 1, 2, 5, 6, 7]
Flip(3) [2, 1, 3, 4, 5, 6, 7]
  • Fünfte Iteration

mi = 2, curr = 3

Flip(mi) [3, 1, 2, 4, 5, 6, 7]
Flip(2) [2, 1, 3, 4, 5, 6, 7]
  • Sechste Iteration

mi = 0, curr = 2

Flip(mi) [2, 1, 3, 4, 5, 6, 7]
Flip(1) [1, 2, 3, 4, 5, 6, 7]

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

Implementierung des Pancake-Sortieralgorithmus

#include <bits/stdc++.h>
using namespace std;
void flip(int arr[], int i) {
  int temp, start = 0;
  while (start < i) {
    temp = arr[start];
    arr[start] = arr[i];
    arr[i] = temp;
    start++;
    i--;
  }
}

int findMax(int arr[], int n) {
  int mi = 0;
  for (int i = 0; i < n; ++i)
    if (arr[i] > arr[mi]) mi = i;
  return mi;
}

void pancakeSort(int arr[], int n) {
  for (int i = n; i > 1; i--) {
    int mi = findMax(arr, i);
    if (mi != i - 1) {
      flip(arr, mi);
      flip(arr, i - 1);
    }
  }
}
int main() {
  int n = 6;
  int arr[6] = {5, 3, 4, 2, 1, 6};
  cout << "Input arr: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
  pancakeSort(arr, n);  // Sort elements in ascending order
  cout << "Output arr: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
}

Pancake-Sortieralgorithmus Komplexität

Zeitkomplexität

  • Durchschnittlicher Fall

Im Durchschnitt werden n-i Vergleiche im lten Durchgang von Pancake Sort durchgeführt. Wenn es also n Iterationen gibt, dann kann die durchschnittliche Zeitkomplexität durch gegeben werden:

(n-1) + (n-2) + (n-3) + ... + 1 = n*(n-1)/2

Daher ist die Zeitkomplexität in der Größenordnung von [Big Theta]: O(n2). Sie kann auch durch Zählen der Anzahl der Schleifen berechnet werden. Es gibt insgesamt zwei Schleifen mit n Iterationen, was die Komplexität ergibt: n*n = n2.

  • Schlimmster Fall

Der Worst-Case tritt auf, wenn die Elemente abwechselnd klein und groß sind. Es sind insgesamt 2n-3 Flips erforderlich. Die Anzahl der erforderlichen Umdrehungen liegt in der Größenordnung von O(n). Die Zeitkomplexität im schlimmsten Fall ist [Big O] O(n2).

  • Bester Fall

Der beste Fall tritt ein, wenn das Array bereits sortiert ist und keine Flips erforderlich sind. Die Zeitkomplexität im besten Fall ist [Big Omega]: O(n).

Raumkomplexität

Die Platzkomplexität für diesen Algorithmus ist O(n), da außer einer temporären Variablen kein zusätzlicher Speicher benötigt wird.

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