팬케이크 정렬
팬케이크 정렬은 반전 기반 정렬 알고리즘입니다. 그것은 주걱을 사용하여 접시에 팬케이크를 닮은 실제 문제를 기반으로합니다. 팬케이크 뒤집기와 유사한 알고리즘에서 사용되는 뒤집기 작업에서 이름을 얻습니다. 정렬을 수행하는 데 필요한 비교 수를 최소화하려는 대부분의 정렬 알고리즘과 달리 최소 반전으로 배열을 정렬하려고합니다. 선택 정렬와 마찬가지로 끝에 최대 요소도 배치합니다.
팬케이크 정렬 알고리즘
n
요소를 포함하는 정렬되지 않은 배열A[]
가 있다고 가정 해 보겠습니다.
PancakeSort()
-
정렬되지 않은 하위 배열의 크기를
curr = n-1
로 초기화하고 반복적으로 크기를1
만큼 줄입니다. -
정렬되지 않은 하위 배열에서 최대 요소
mi
의 인덱스를 찾습니다. -
flip(A, mi)
를 사용하여A[0, ..., mi]
를 뒤집어 인덱스0
에서 최대 요소A[i]
를 이동합니다. -
flip(A, i)
를 사용하여A[0, ..., i]
를 뒤집어 최대 요소A[i]
를 올바른 위치로 이동합니다.
Flip()
-
첫 번째 색인
f
의 요소를 마지막 색인e
의 요소와 바꿉니다. -
f
를 증가시키고e
를 감소시킵니다. -
f
<=e
까지 위 단계를 반복합니다.
팬케이크 정렬 예
배열이(3, 5, 2, 1, 7, 6, 4)
라고 가정합니다. 팬케이크 정렬 알고리즘을 사용하여 정렬합니다.
- 첫 번째 반복
mi
= 4,curr
= 7
뒤집기 (mi) | [** 7, 1, 2, 5, 3 **, 6, 4] |
뒤집기 (6) | [** 4, 6, 3, 5, 2, 1, 7 **] |
- 두 번째 반복
mi
= 1,curr
= 6
뒤집기 (mi) | [** 6, 4 **, 3, 5, 2, 1, 7] |
뒤집기 (5) | [** 1, 2, 5, 3, 4, 6 **, 7] |
- 세 번째 반복
mi
= 2,curr
= 5
뒤집기 (mi) | [** 5, 2, 1 **, 3, 4, 6, 7] |
뒤집기 (4) | [** 4, 3, 1, 2, 5 **, 6, 7] |
- 네 번째 반복
mi
= 0,curr
= 4
뒤집기 (mi) | [** 4, 3, 1, 2, 5 **, 6, 7] |
뒤집기 (3) | [** 2, 1, 3, 4 **, 5, 6, 7] |
- 다섯 번째 반복
mi
= 2,curr
= 3
뒤집기 (mi) | [** 3, 1, 2 **, 4, 5, 6, 7] |
뒤집기 (2) | [** 2, 1, 3 **, 4, 5, 6, 7] |
- 여섯 번째 반복
mi
= 0,curr
= 2
뒤집기 (mi) | [** 2, 1 **, 3, 4, 5, 6, 7] |
뒤집기 (1) | [** 1, 2 **, 3, 4, 5, 6, 7] |
최종 정렬 된 배열을1, 2, 3, 4, 5, 6, 7
로 얻습니다.
팬케이크 정렬 알고리즘 구현
#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";
}
팬케이크 정렬 알고리즘 복잡성
시간 복잡성
- 평균 사례
평균적으로 팬케이크의 i번째 패스에서 n-i를 비교한다. 따라서 n
개의 반복이있는 경우 평균 시간 복잡도는 다음과 같이 지정할 수 있습니다.
(n-1) + (n-2) + (n-3) + ... + 1 = n*(n-1)/2
따라서 시간 복잡도는 [Big Theta] : O(n2) 정도입니다. 루프 수를 세어 계산할 수도 있습니다. 복잡하게 만드는n
반복의 총 2 개의 루프가 있습니다 : n * n = n2.
- 최악의 경우
최악의 경우는 요소가 크고 작은 요소를 번갈아 가며 발생합니다. 총 ‘2n-3’번 플립이 필요합니다. 필요한 플립 수는 O(n)
순서입니다. 최악의 경우 시간 복잡도는 [Big O] : O(n2)입니다.
- 베스트 케이스
최상의 경우는 배열이 이미 정렬되어 있고 뒤집기가 필요하지 않을 때 발생합니다. 최적의 시간 복잡도는 [Big Omega] :O(n)
입니다.
공간 복잡성
이 알고리즘의 공간 복잡도는 임시 변수 이외의 추가 메모리가 필요하지 않기 때문에O(n)
입니다.
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