[编程之美]一摞烙饼的排序

先想了一个最简单的方法:首先对n个烙饼进行处理,找到最大的那个烙饼,将其之上的进行翻转,然后对前n个烙饼堆进行翻转;第二次操作对上面n-1个烙饼进行操作,还是找到n-1个中最大的,将其之上的进行翻转,然后对前n-1个烙饼堆进行翻转。。。这样总共进行n-1次,每次翻转两次orz

View Code
 1 #include <iostream>
2 using namespace std;
3
4 int a[10];
5
6 void Create_Array()
7 {
8 cout <<"input ten numbers:";
9 for(int i=0;i<10;++i)
10 cin >>a[i];
11 }
12
13 int Get_Largest(int *arr,int n)
14 {
15 int largest=arr[0];
16 int idx=0;
17
18 for(int i=1;i<n;++i)
19 if(arr[i]>largest)
20 idx=i;
21
22 return idx;
23 }
24
25 void Reverse(int *arr,int m)
26 {
27 for(int i=0;i<=m/2-1;++i)
28 {
29 int tmp=arr[i];
30 arr[i]=arr[m-1-i];
31 arr[m-1-i]=tmp;
32 }
33 }
34
35 void Sort(int *arr,int n)
36 {
37 for(int i=n;i>1;--i)
38 {
39 int index=Get_Largest(arr,i);
40 Reverse(arr,index+1);
41 Reverse(arr,i);
42 }
43 }
44
45 int main()
46 {
47 Create_Array();
48 Sort(a,10);
49 for(int i=0;i<10;++i)
50 cout <<a[i]<<" ";
51 cout <<endl;
52 return 0;
53 }

 

maybe wrong!!
  1 #include <iostream>
2
3 using namespace std;
4
5
6 int* Cake;
7 int cake_num;
8 int max_swap;
9 int* swap_info;
10 int search_num;
11
12 int UpperBound(int num)
13 {
14 return (num-1)*2;
15 }
16
17 void Init()
18 {
19 cout <<"enter the number of cakes:";
20 cin >>cake_num;
21 Cake=new int[cake_num];
22 cout <<endl<<"enter diameter of each cake:";
23 for(int i=0;i<cake_num;++i)
24 cin >>Cake[i];
25
26 max_swap=UpperBound(cake_num);
27 swap_info=new int[max_swap];
28 search_num=0;
29 }
30
31
32
33
34 int LowerBound(int num)
35 {
36 int t,cnt=0;
37 for(int i=1;i<num;++i)
38 {
39 t=Cake[i]-Cake[i-1];
40 if(t==1 || t==-1)
41 {
42
43 }
44 else
45 cnt++;
46 }
47 return cnt;
48 }
49
50 bool IsSorted()
51 {
52 for(int i=0;i<cake_num-1;++i)
53 {
54 if(Cake[i]>Cake[i+1])
55 return false;
56 }
57 return true;
58 }
59
60 void Reverse(int end)
61 {
62 for(int i=0;i<=(end+1)/2-1;++i)
63 {
64 int tmp=Cake[i];
65 Cake[i]=Cake[end-i];
66 Cake[end-i]=tmp;
67 }
68 }
69
70 void Search(int step)
71 {
72 int nEstimate;
73 search_num++;
74 nEstimate=LowerBound(cake_num);
75
76 if(step+nEstimate>max_swap || step>=max_swap)
77 return;
78
79 if(IsSorted())
80 {
81 if(step<max_swap)
82 max_swap=step;
83 return;
84 }
85
86 for(int i=1;i<cake_num;++i)
87 {
88 Reverse(i);
89 swap_info[step]=i;
90 Search(step+1);
91 Reverse(i);
92 }
93 }
94
95 void Output()
96 {
97 for(int i=0;i<cake_num;++i)
98 cout <<Cake[i]<<" ";
99 cout <<endl;
100 }
101
102 int main()
103 {
104 Init();
105 Search(0);
106 Output();
107 return 0;
108 }

 

posted @ 2012-03-14 22:07  Cavia  阅读(612)  评论(0编辑  收藏  举报