大饼的排序
来源:互联网 发布:ubuntu查看samba用户 编辑:程序博客网 时间:2024/04/28 23:41
来源于编程之美的一摞烙饼的排序。2种实现思路:
1. 从底层开始排序
2. 从上面开始排序
从上面排序分三种情况,不翻转,翻转一次,翻转3次(最开始以为是2次●0●)。这样看第一种最优,但是第二种是首先想到的方法,所以也进行了实现。菜鸟很菜的一个程序,写出来安慰一下自己:我有做过(一种悲伤的气氛)。
下面是完整的算法,其中run()是第二种,runbottom是第一种。
class Solution{public: Solution() { pi_num=0; rev_num=0; flag=true; } ~Solution() { if (pi_Arry!=NULL) { delete pi_Arry; } } void revert(int a,int b)//将在a~b之间的元素进行反转,包含a,b { // assert(a<b); int i,j; i=a; j=b; if (i<j) { rev_num++; } for (;i<j;i++,j--) { int temp=0; temp=pi_Arry[i]; pi_Arry[i]=pi_Arry[j]; pi_Arry[j]=temp; } } int set_pie_Arry( int *in_pieArry,int in_pinum )//将元素保存在类的元素数组 { if (in_pieArry==NULL||in_pinum<=0) { return 0; } pi_Arry=new int[in_pinum]; for (int a=0;a<in_pinum;a++) { pi_Arry[a]=in_pieArry[a]; } pi_num=in_pinum; putout(); return 1; } void putout()//将排序好的数组输出 { cout<<"The sorted num are:"; for (int i=0;i<pi_num;i++) { cout<<pi_Arry[i]<<' '; } cout<<endl; cout<<"the reverse num is:"<<rev_num; //getchar(); } void run()//从上到下的排序 { for (int i=2;i<pi_num;i++) { if (pi_Arry[i-1]>=pi_Arry[0])//首先判断已排好顺序的元素的排序方向 { flag=true; } else flag=false; if ((pi_Arry[i]>=pi_Arry[i-1]&&flag==true)||(pi_Arry[i]<=pi_Arry[i-1]&&flag==false))//不需要反转 { continue; } else if ((pi_Arry[i]<=pi_Arry[0]&&flag==true)||(pi_Arry[i]>=pi_Arry[0]&&flag==false))//翻转1次 { revert(0,i-1); } else if ((pi_Arry[0]<pi_Arry[i]&&pi_Arry[i]<pi_Arry[i-1]&&flag==true)||(pi_Arry[0]>pi_Arry[i]&&pi_Arry[i]>pi_Arry[i-1]&&flag==false))//翻转3次 { revert(0,i); int temp=0; if (flag==true) { for (temp=2;temp<i;temp++) { if (pi_Arry[temp]<=pi_Arry[0]) { break; } } } else { for (temp=2;temp<i;temp++) { if (pi_Arry[temp]>=pi_Arry[0]) { break; } } } revert(0,temp-1); revert(0,temp-2); } } if (pi_Arry[pi_num-1]<=pi_Arry[0]) { revert(0,pi_num-1); } } void runbottom()//从下往上(方便书写是从上往下,最后进行一次翻转) { int bigarr=0; int bignum=0; for (int i=0;i<pi_num;i++) { bigarr=pi_Arry[i]; bignum=i; for (int j=i+1;j<pi_num;j++) { if (bigarr<pi_Arry[j])//找到最大次大的进行排序翻转,最多2次 { bigarr=pi_Arry[j]; bignum=j; } } if (bignum!=i) { revert(bignum,pi_num-1); revert(i,pi_num-1); } } } private: int *pi_Arry;//保存的元素数组 int pi_num;//元素的个数 int rev_num;//翻转的次数 bool flag;//从上排序时,上面饼子的顺序,如果上面到下面是从小到大则flag=true,否则flag=false}最后进行测试int main(void){ int num[150]; int a; cin>>a; int i=0; int j=a; while(j) { cin>>num[i]; i++; j--; } Solution numbers; numbers.set_pie_Arry(num,a); numbers.run(); numbers.putout();}
0 0
- 大饼的排序
- 贾跃亭画了一个8500亿的大饼
- 看到满屏的锥子脸,姐大吼一声:姐就是喜欢大饼脸就是喜欢大饼脸娱乐八卦天涯论坛
- 画大饼
- 大饼子
- 我与传智结缘的过程:一个50万大饼的故事
- 特斯拉这次画的“大饼”,有这些点值得细细分析
- Spring整合Strust2-【大饼】
- AChartEngine中大饼图
- python和递推算法解决一张大饼切N刀最多切多少块的问题
- 靠给员工画大饼,一口气创办10家公司 他的创业模式吓坏大佬!
- 瞧,那有一张大饼
- 1194_大饼总价问题
- iOS 绘制进度条 --新浪 郭大饼
- 南邮 OJ 1194 大饼总价问题
- 柱形图、折线图、大饼图、地图
- 大饼玩Kettle之安装Kettle7.1
- 大饼玩Kettle之配置数据库连接
- IOS 人民币数值大小写转换代码
- 关于地址运算的一点领悟
- 数组初始化
- locale简介
- LR参数化的迭代设置
- 大饼的排序
- HttpClient使用详解
- Mupdf build
- 观察者模式
- RPM安装
- js flash跨域
- 代码管理Git-常用命令详解
- 删除主键约束时是否删除索引
- windows下Go语言开发环境搭建