《编程之美》一摞烙饼的排序
来源:互联网 发布:优酷 网络大电影 排行 编辑:程序博客网 时间:2024/04/30 05:50
题目:盘子中一堆烙饼,杂乱放着。一位有强迫症的顾客看到后,心里很不舒服,打算把这些饼给从小到大、从上到下放好。他注意到这些烙饼大小不一,心想该如何把它们放好。想了半天,他一手托着盘子,一手抓住最上面的几块饼,把它们上下颠倒个个,几次之后,顺序排列好了。他心里也舒服多了。
假如用程序描述这位强迫症顾客的行为,该如何描述?尽量优化。
想法:
1、先找大的:由于一次要翻转最上面的几块饼,并且是颠倒个个,因此每次颠倒之前,找到当前最大的饼,颠倒,把最大的饼放到最上面,再颠倒,把这个当前最大的饼放到合适的位置,依次递推,最后从小到大、从上到下排好顺序。
2、先找小的:每次颠倒前,找到当前最小的,颠倒,把当前最小的饼放到最上面,然后颠倒,把当前最小的放到比之更小的饼的上面,然后从所有最小的饼所放的位置颠倒,即可。
在任何一种想法实现过程中,每次排序之前,查看当前位置的饼是否符合要求,如果符合要求就不进行排序,否则进行排序,这样可以减少排序次数。
每次颠倒次数,想法1的比想法2的要少。
代码:
想法1:
#include <stdio.h>#define MAXSIZE 10void print(int bing[]);void findbigger(int bing[]);void sort_size(const int bing[], int bing_size[]);int find_bigger_pos(const int size, const int bing[]);/* 打印当前饼的大小*/void print(int bing[]){ int index = 0; printf("(bing size): "); while(index < MAXSIZE) { printf("%d ",bing[index]); index ++; } printf("\n");}/* 想法1:先找大的*/void findbigger(int bing[]){ int bing_size[MAXSIZE];//饼的排序后的大小(从大到小) int tmp_bigger_pos = 0;//当前最大size的饼的位置 int tmp_index = MAXSIZE - 1;//指向排序后的饼的临时索引值 int bing_a_set[MAXSIZE]; int bing_b_set[MAXSIZE]; int a_set_index = 0; int b_set_index = 0; int number = 0;//排序次数 sort_size(bing, bing_size); while(tmp_index >= 0) { //首先查看当前的饼的位置是否符合要求 if(bing[tmp_index] == bing_size[tmp_index])//符合要求,查看下一个 { ; } else//不符合要求,调整 { tmp_bigger_pos = find_bigger_pos(bing_size[tmp_index], bing);//查找到当前最大的饼的位置,正常情况下,该位置小于调整后的位置 a_set_index = 0; //从当前位置到位置0处,划分为一部分a_set,另存储,从调整后的位置到当前位置+1,划分为另一部分b_set。a_set部分按照当前顺序移动到调整后位置,b_set部分逆序排列到从位置0处 while(a_set_index <= tmp_bigger_pos) { bing_a_set[a_set_index] = bing[a_set_index]; a_set_index ++; } //b_set部分逆序从位置0存储 b_set_index=0; while(b_set_index +a_set_index <=tmp_index) { bing_b_set[b_set_index] = bing[tmp_index - b_set_index]; b_set_index++; } //b_set逆序从位置0存储 b_set_index = 0; while(b_set_index < tmp_index - tmp_bigger_pos) { bing[b_set_index] = bing_b_set[b_set_index]; b_set_index++; } //a_set按照当前顺序移动到调整后的位置 a_set_index = 0; while(a_set_index <= tmp_bigger_pos) { bing[a_set_index +b_set_index] = bing_a_set[a_set_index]; a_set_index++; } if(tmp_bigger_pos == 0) number++; else number +=2; printf("%d ", number); print(bing); } tmp_index --; } printf("Total %d times to sort OK.\n",number);}/* 对饼的大小进行排序(从小到大),方便找饼及判断是否找完 * bing[]:原来饼的大小 * bing_size[]:排序后饼的大小 * 使用冒泡法 */void sort_size(const int bing[], int bing_size[]){ int out_index = 0;//外部循环索引 int in_index = 0;//内部循环索引 int tmp_value = 0;//临时变量 for(in_index = 0;in_index < MAXSIZE;in_index++) { bing_size[in_index] = bing[in_index]; } while(out_index < (MAXSIZE - 1)) { in_index = MAXSIZE - 1; while(in_index > out_index) { if(bing_size[in_index - 1] > bing_size[in_index]) { tmp_value = bing_size[in_index]; bing_size[in_index] = bing_size[in_index-1]; bing_size[in_index-1] = tmp_value; } in_index --; } out_index ++; }}/* * 根据大小查找原有饼中的位置 */int find_bigger_pos(const int size, const int bing[]){ int tmp_pos = 0; while(tmp_pos < MAXSIZE) { if(size == bing[tmp_pos]) break; tmp_pos++; } return tmp_pos;}/* 主程序*/int main(){ int bing[10] = {3,5,4,8,9,10,1,6,2,7}; /* 当前饼的大小*/ print(bing); /* 想法1:先找大的*/ findbigger(bing); return 0;}
想法2:
#include <stdio.h>#define MAXSIZE 10void print(int bing[]);void findsmaller(int bing[]);void sort_size(const int bing[], int bing_size[]);int find_smaller_pos(const int size, const int bing[]);/* 打印当前饼的大小*/void print(int bing[]){ int index = 0; printf("(bing size): "); while(index < MAXSIZE) { printf("%d ",bing[index]); index ++; } printf("\n");}/* 想法2:先找小的*/void findsmaller(int bing[]){ int bing_size[MAXSIZE];//饼的排序后的大小(从大到小) int tmp_smaller_pos = 0;//当前最小size的饼的位置 int tmp_index = 0;//指向排序后的饼的临时索引值 int bing_a_set[MAXSIZE]; int a_set_index = 0; int number = 0;//排序次数 sort_size(bing, bing_size); while(tmp_index < MAXSIZE) { //首先查看当前的饼的位置是否符合要求 if(bing[tmp_index] == bing_size[tmp_index])//符合要求,查看下一个 { ; } else//不符合要求,调整 { tmp_smaller_pos = find_smaller_pos(bing_size[tmp_index], bing);//查找到当前最小的饼的位置,一般情况下,该位置大于调整后的位置 a_set_index = tmp_index; //从调整的位置到当前最小的饼的位置,需要逆序存储,然后从调整位置到当前位置存放到原来的饼处 while(a_set_index <= tmp_smaller_pos) { bing_a_set[tmp_smaller_pos - a_set_index] = bing[a_set_index]; a_set_index ++; } //a_set逆序从位置0存储 a_set_index = 0; while(a_set_index < tmp_smaller_pos - tmp_index + 1) { bing[a_set_index + tmp_index] = bing_a_set[a_set_index]; a_set_index++; } if(tmp_index == 0) { number ++; } else number += 3; printf("%d ", number); print(bing); } tmp_index ++; } printf("Total %d times to sort OK.\n",number);}/* 对饼的大小进行排序(从小到大),方便找饼及判断是否找完 * bing[]:原来饼的大小 * bing_size[]:排序后饼的大小 * 使用选择排序法 */void sort_size(const int bing[], int bing_size[]){ int index; int tmp_index; int small_index; int small_value; index = 0; while(index < MAXSIZE) { bing_size[index] = bing[index]; index++; } index=0; while(index<MAXSIZE) { small_value = bing_size[index]; small_index = index; tmp_index = index+1; while(tmp_index < MAXSIZE) { if(small_value > bing_size[tmp_index]) { small_value = bing_size[tmp_index]; small_index = tmp_index; } tmp_index++; } if(small_index != index) { bing_size[small_index] = bing_size[index]; bing_size[index] = small_value; } index++; }}/* * 根据大小查找原有饼中的位置 */int find_smaller_pos(const int size, const int bing[]){ int tmp_pos = 0; while(tmp_pos < MAXSIZE) { if(size == bing[tmp_pos]) break; tmp_pos++; } return tmp_pos;}/* 主程序*/int main(){ int bing[10] = {3,5,4,8,9,10,1,6,2,7}; /* 当前饼的大小*/ print(bing); /* 想法2:先找小的*/ findsmaller(bing); return 0;}
- 编程之美:一摞烙饼排序
- 编程之美 - 一摞烙饼的排序
- 编程之美 - 读书笔记 - 一摞烙饼的排序问题
- 编程之美 一摞烙饼的排序问题
- 编程之美:一摞烙饼的排序
- 编程之美1.3 一摞烙饼的排序
- 【编程之美】一摞烙饼的排序
- 【编程之美】一摞烙饼的排序 .
- 编程之美---一摞烙饼的排序
- 编程之美1.3 一摞烙饼的排序
- 《编程之美》一摞烙饼的排序
- 关于编程之美 1.3一摞烙饼的排序
- 编程之美:一摞烙饼的排序
- 一摞烙饼的排序----《编程之美》读书笔记
- 【编程之美】一摞烙饼的排序
- 编程之美:第一章 1.3 一摞烙饼的排序
- 编程之美学习笔记--一摞烙饼的排序
- 编程之美-一摞烙饼的排序方法整理
- 交叉编译glibc时遇到的include/asm-arm目录不存在的问题
- 双向DFS模板题
- 推荐几款好用工具Vim、Emacs、Total Commander 还有排版软件Latex(程序员级,富有挑战性)
- 初学QT的Graphices view framework
- C++ 成员函数指针
- 《编程之美》一摞烙饼的排序
- delphi 获取打印队列状态
- hadoop 0.20.2中hbase 0.90.5的完全分布式安装
- hdu 4677 并查集+分块算法 好题 (2013多校联合)
- Codeforces Beta Round #19 D Points
- centos 6.4 编译安装vim7.4,解决没有gvim的问题
- CSDN客户端开发-------前述
- csdn其它链接记录
- 酷狗收音机 一直在重新连接,不能收听