สมมติว่าเรามีอาร์เรย์ A เราจะใช้เทคนิคการจัดเรียงแพนเค้กใน A โดยที่ข้อจำกัดหลักคือเราสามารถใช้การดำเนินการเดียวที่เรียกว่า rev(arr, i) สิ่งนี้จะย้อนกลับองค์ประกอบของ arr จาก 0 ไปยังตำแหน่ง ith แนวคิดนี้เหมือนกับการเรียงลำดับการเลือก เราวางองค์ประกอบสูงสุดซ้ำ ๆ ที่ส่วนท้ายเพื่อลดขนาดของอาร์เรย์ ดังนั้นหากอินพุตเป็น [54,85,52,25,98,75,25,11,68] ผลลัพธ์จะเป็น [11,25,25,52,54,68,75,85,98]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ขนาด :=น
-
ในขณะที่ขนาด> 1 ทำ
-
index :=ดัชนีขององค์ประกอบสูงสุดใน arr จาก [0 ถึงขนาด – 1]
-
rev(arr, ดัชนี)
-
rev(arr, ขนาด - 1)
-
ขนาด :=ขนาด - 1
-
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include<iostream>
using namespace std;
void rev(int arr[], int i) {
int temp, st = 0;
while (st < i) {
temp = arr[st];
arr[st] = arr[i];
arr[i] = temp;
st++;
i--;
}
}
int maxIndex(int arr[], int n) {
int index, i;
for (index = 0, i = 0; i < n; ++i){
if (arr[i] > arr[index]) {
index = i;
}
}
return index;
}
int pancakeSort(int arr[], int n) {
for (int size = n; size > 1; size--) {
int index = maxIndex(arr, size);
if (index != size-1) {
rev(arr, index);
rev(arr, size-1);
}
}
}
int main() {
int arr[] = {54, 85, 52, 25, 98, 75, 25, 11, 68};
int n = sizeof(arr)/sizeof(arr[0]);
pancakeSort(arr, n);
cout << "Sorted array: ";
for (int i = 0; i < n; ++i)
cout << arr[i] << " ";
} อินพุต
[54, 85, 52, 25, 98, 75, 25, 11, 68]
ผลลัพธ์
[11,25,25,52,54,68,75,85,98]