此 C 程式在整數陣列上實作煎餅排序。
煎餅排序是排序問題的變體,其中唯一允許的操作是反轉序列中某些前綴的元素。
煎餅排序是排序問題的變體,其中唯一允許的操作是反轉序列中某些前綴的元素。 p>
煎餅排序是一個通俗術語,指的是一個數學問題,即在一堆無序的煎餅中按大小順序排序,此時可以將抹刀插入煎餅堆中的任意點並用於翻轉所有煎餅上面有煎餅。煎餅數是給定數量的煎餅所需的最少翻轉次數
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</p><p>", moves); }
以上是煎餅排序的C程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!