Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

팬케이크 분류를 위한 C 프로그램?

<시간/>

이 C 프로그램은 정수 배열에 팬케이크 정렬을 구현합니다.

팬케이크 정렬은 정렬 문제의 변형으로, 유일하게 허용되는 작업은 시퀀스의 일부 접두어 요소를 뒤집는 것입니다.

팬케이크 분류 주걱을 스택의 임의의 지점에 삽입하고 그 위의 모든 팬케이크를 뒤집는 데 사용할 수 있을 때 팬케이크 더미를 크기 순서대로 정렬하는 수학적 문제에 대한 구어적 용어입니다. 팬케이크 번호는 주어진 팬케이크 수에 필요한 최소 뒤집기 횟수입니다.

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);
}