Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

โปรแกรม C สำหรับการคัดแยกแพนเค้ก?


โปรแกรม 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);
}