Pfannkuchen sortieren
- Pfannkuchen-Sortieralgorithmus
- Beispiel für Pfannkuchensortierung
- Implementierung des Pancake-Sortieralgorithmus
- Pancake-Sortieralgorithmus Komplexität
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 um1
. -
Finden Sie den Index des maximalen Elements
mi
im unsortierten Subarray. -
Flip
A[0, ... , mi]
mitflip(A,mi)
, um das maximale ElementA[i]
auf den Index0
zu verschieben. -
Flip
A[0, ... , i]
unter Verwendung vonflip(A,i)
, um das maximale ElementA[i]
an seine korrekte Position zu verschieben.
Flip()
-
Vertausche das Element am ersten Index
f
mit dem am letzten Indexe
. -
Inkrementieren Sie
f
und dekrementieren Siee
. -
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 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