烙饼排序

 1 #include <stdio.h>
 2 // print the array
 3 int printArr(int* arr, int length)
 4 {
 5     int i = 0;
 6     for(i=0;i<length;i++)
 7         printf("%d\t",arr[i]);
 8     printf("\n");
 9 }
10 // swap 2 value
11 void swapValue(int *a, int * b)
12 {
13     int temp = 0;
14     temp = *a;
15     *a = *b;
16     *b = temp;
17 }
18 // check whether the array is sorted
19 int isDone(int * arr, int length)
20 {
21     while(--length>=1)
22     {
23         if(arr[length]>arr[length-1])
24             return 0;
25     }
26     return 1;
27 }
28 // find the biggest value‘s index
29 int findMaxIndex(int* arr, int length)
30 {
31     int i = 0;
32     int standBy = arr[0];
33     while(length--)
34     {
35         if(standBy < arr[length])
36         {
37             standBy = arr[length];
38             i = length;
39         }
40     }
41     return i;
42 }
43 // reverse the part of the array from the start position
44 int reversePart(int* arr, int start, int length)
45 {
46     int end = length-1;
47     while(start<=end)
48     {
49         swapValue(&arr[start],&arr[end]);
50         start++;
51         end--;
52     }
53 }
54 // core algorithm
55 // 1. find the biggest value‘s index
56 // 2. check if the index is at the head of the array
57 //    true : enter the next loop
58 //    false : go to 3 step
59 // 3. check if the index is at the end of the array
60 //    true : go to 4 step
61 //    false : reverse the part -- get the biggest value to the end of the array
62 // 4. reverse the selected part of the array
63 // 5. check whether the array is sorted
64 //    true : break the loop
65 //    false : enter the next loop
66 void biscuitSort(int* arr, int length)
67 {
68     int start = 0;
69     int maxIndex = 0;
70     for(start = 0; start < length; start++)
71     {
72         maxIndex = findMaxIndex(arr+start,length-start);
73         if(maxIndex != 0)
74         {
75             if(maxIndex != length-start-1)
76             {
77                 reversePart(arr+start,maxIndex,length-start);
78                 printArr(arr,length);
79             }
80             reversePart(arr+start,0,length-start);
81             printArr(arr,length);
82             if(isDone(arr,length))
83                 break;
84         }
85     }
86 }
87
88 int main()
89 {
90     int arr[]= {7,1,2,5,4};
91     printArr(arr, sizeof(arr)/sizeof(int));
92     biscuitSort(arr, sizeof(arr)/sizeof(int));
93     return 0;
94 }

烙饼排序

时间: 2024-11-06 03:29:58

烙饼排序的相关文章

24点计算问题

问题描述:N个1到13之间的自然数,找出所有能通过加减乘除计算(每个数有且只能用一次)得到24的组合? 计算24点常用的算法有三种,第一种方法:任取两个数,计算后,将结果放回去,再从剩下的数中任取两个,如此反复直到只剩下一个数:第二种方法:先构建前缀/后缀表达式,再计算该表达式:第三种方法是用集合保存中间结果,集合间两两进行合并计算得到新集合(或者对给定的一个集合,对其所有的子集合进行合并计算).本博文首先采用第一种方法.六种操作符:ADD(加).SUB(减).MUL(乘).DIV(除).RSU

《编程之美》之一摞烙饼的排序

星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯,程序员多喝了几杯之后谈什么呢?自然是算法 问题.有个同事说: “我以前在餐厅打工,顾客经常点非常多的烙饼.店里的烙饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小 次序摆好---小的在上面,大的在下面.由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们 上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了.我后来想,这实际上是个有趣的排序问题:假设有n块大小 不一的摞饼,那最少要翻几次,才能达到大小有序的结果呢?”

第1章 游戏之乐——一摞烙饼的排序

一摞烙饼的排序 问题:写出一个程序,对于n块大小不一的烙饼,输出最优化的翻饼过程?要保证烙饼按照大小次序摆好——小的在上面,大的在下面. 分析与解法: 用java实现的代码如下: package chapter1youxizhilePrefixSorting; import java.util.Scanner; /** * 一摞烙饼的 * @author DELL * */ public class PrefixSorting { private int[] m_CakeArray; //烙饼信

编程之美学习笔记之 一摞烙饼的排序

编程之美书中讲的一摞烙饼的排序一题 这里无法用基本的排序方法对其排序,那么最直接的方法是找出N个数种最大者,将这通过两次翻转放置到最底部,然后处理N-1,N-2等,直到全部排序完,所以一共需要交换2(N-1)次 void reverse(int cakes[], int beg, int end) { int temp; while(beg < end){ temp = cakes[beg]; cakes[beg++] = cakes[end]; cakes[end--] = temp; } }

编程之美——一摞烙饼的排序(暴搜+剪枝)

题目 分析 深度优先搜索遍历每一种情况,去翻转次数最小的,当然,还要加一些剪枝,毕竟O(nn)的时间复杂度. 代码 C风格 1 /**** 前缀排序 ****/ 2 #include<stdio.h> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 100 + 10; 8 int n, arr[maxn]; //烙饼个数和烙饼数组 9 int ar

编程之美之一摞烙饼的排序1

拿到这个问题, 第一反应是利用分治的算法思想, 每次把当前的最大的一块烙饼放到指定位置 ,这样的思想非常简单,实现也非常容易.但是这只是提供了,问题的一个可行解,看完书中的内容之后发现,题目中要求的是最优化的输出过程,我们的这种方法显然没有考虑到优化<-_->!! 其实,我觉得就算我看到了这个最优化输出的要求,估计也想不到书中的设计思想的了.过段时间,等自己把书中的思想忘掉之后,再看看能不能想到这种算法思想吧.这应该算是埋了个坑吧 <-_->!! 这里将自己的代码贴出来: // =

编程之美——1.3一摞烙饼的排序

//自己看到这个问题后的解法#include<iostream> using namespace std; typedef int status; //将一个数组p的坐标0到i的元素调个头 status diao_tou(int *p,int i) { if(i==0) return 1; for(int j=0;j<=((i-1)/2);j++) { int temp; temp=p[i-j]; p[i-j]=p[j]; p[j]=temp; } return 1; } int mai

编程之美—烙饼排序问题(JAVA)

一.问题描述 星期五的晚上,一帮同事在希格玛大厦附近的"硬盘酒吧"多喝了几杯.程序员多喝了几杯之后谈什么呢?自然是算法问题.有个同事说:"我以前在餐      馆打工,顾客经常点非常多的烙饼.店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好--小的在上面,大的在下面.由于我      一只手托着盘子,只好用另一只手,一次抓最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了.我后来想,这实际上是个     有趣的排序问题:假设有n块大小不一

笔试算法题(33):烙饼排序问题 &amp; N!阶乘十进制末尾0的个数二进制最低1的位置

出题:不同大小烙饼的排序问题:对于N块大小不一的烙饼,上下累在一起,由于一只手托着所有的饼,所以仅有一只手可以翻转饼(假设手足够大可以翻转任意块数的 饼),规定所有的大饼都出现在小饼的下面则说明已经排序,则最少需要翻转几次,才能达到大小有序的结果(改变饼的顺序只能整体翻转,不能相邻交换): 分析: 假设饼大小编号为1,--,N,1就是最小的饼,N就是最大的饼,最大的N饼翻转到最下面之前,一定需要达到最上面,所以首先需要寻找N饼所在的位置,翻 转到最上面,然后翻转所有的饼,这样N饼就可以就位: 然