โปรแกรม C นี้ใช้ Pancake Sort on Array of Integers
การเรียงลำดับแพนเค้กเป็นรูปแบบหนึ่งของปัญหาการเรียงลำดับซึ่งการดำเนินการที่ได้รับอนุญาตเท่านั้นคือการย้อนกลับองค์ประกอบของคำนำหน้าบางส่วนของลำดับ
การเรียงแพนเค้ก เป็นศัพท์ที่ใช้กันสำหรับปัญหาทางคณิตศาสตร์ในการจัดเรียงแพนเค้กที่ไม่เป็นระเบียบตามลำดับขนาดเมื่อสามารถใส่ไม้พายที่จุดใดก็ได้ในกองและใช้เพื่อพลิกแพนเค้กทั้งหมดที่อยู่ด้านบน จำนวนแพนเค้กคือจำนวนพลิกขั้นต่ำที่จำเป็นสำหรับแพนเค้กตามจำนวนที่กำหนด
Input:5,3,2,1,4 Output:1 2 3 4 5
คำอธิบาย
เป็นรูปแบบหนึ่งของปัญหาการเรียงลำดับซึ่งการดำเนินการที่ได้รับอนุญาตเท่านั้นคือการย้อนกลับองค์ประกอบของคำนำหน้าบางส่วนของลำดับ ต่างจากอัลกอริธึมการเรียงลำดับแบบเดิมซึ่งพยายามจัดเรียงด้วยการเปรียบเทียบน้อยที่สุดเท่าที่จะเป็นไปได้ เป้าหมายคือการเรียงลำดับตามลำดับในการกลับรายการน้อยที่สุด ปัญหาที่แตกต่างกันคือแพนเค้กไหม้ โดยที่แพนเค้กแต่ละชิ้นมีด้านที่ไหม้ และแพนเค้กทั้งหมดจะต้องจบลงด้วยด้านที่ไหม้อยู่ด้านล่าง
ตัวอย่าง
#include <iostream>
using namespace std;
void do_flip(int *, int, int);
int pancake_sort(int *list, unsigned int length) {
if (length < 2)
return 0;
int i, a, max_num_pos, moves;
moves = 0;
for (i = length;i > 1;i--) {
max_num_pos = 0;
for (a = 0;a < i;a++){
if (list[a] > list[max_num_pos])
max_num_pos = a;
}
if (max_num_pos == i - 1)
continue;
if (max_num_pos){
moves++;
do_flip(list, length, max_num_pos + 1);
}
do_flip(list, length, i);
}
return moves;
}
void do_flip(int *list, int length, int num) {
int swap;
int i = 0;
for (i=0;i < --num;i++) {
swap = list[i];
list[i] = list[num];
list[num] = swap;
}
}
int main(int argc, char **argv) {
int arr[]={5,3,2,1,4};
int n=5;
int moves=pancake_sort(arr, n);
for (int i = 0;i < n;i++) {
printf("%d ", arr[i]);
}
printf(" - with a total of %d moves\n", moves);
}