煎饼排序 (Stacks of Flapjacks, Uva 120)
2017-10-15 05:12
411 查看
Stacks of Flapjacks的题目详见Uva 120。解法类似与插入排序,每次找未排好序列中数字最大的煎饼并将其翻至锅顶,然后将全部未排序的序列翻转。这样就排好了一个数字。
因为STL vector里面已经有max_element()和reverse(),所以直接用STL会比较方便。注意reverse里面的第二个元素是基于vector.end(),它是最后一个元素的后一个元素,所以如果第二个元素不是end()而是某个具体元素的指针的话,要加1。否则出错。
程序如下:
程序输出如下:
original flapjacks
2 5 7 6 4 8 11 4
n=0
11 8 4 6 7 5 2 4 4 2 5 7 6 4 8 11
n=1
8 4 6 7 5 2 4 11 4 2 5 7 6 4 8 11
n=2
7 5 2 4 6 4 8 11 4 6 4 2 5 7 8 11
n=3
6 4 4 2 5 7 8 11 5 2 4 4 6 7 8 11
n=4
5 2 4 4
4000
6 7 8 11 4 4 2 5 6 7 8 11
n=5
4 4 2 5 6 7 8 11 2 4 4 5 6 7 8 11
n=6
4 2 4 5 6 7 8 11 2 4 4 5 6 7 8 11
n=7
2 4 4 5 6 7 8 11 2 4 4 5 6 7 8 11
after sorting
2 4 4 5 6 7 8 11
Process returned 0 (0x0) execution time : 0.087 s
Press any key to continue.
看来用STL虽然方便,可是太慢了(可能是涉及到iterator的关系?),直接用写函数max()和reverse()可能快些。
因为STL vector里面已经有max_element()和reverse(),所以直接用STL会比较方便。注意reverse里面的第二个元素是基于vector.end(),它是最后一个元素的后一个元素,所以如果第二个元素不是end()而是某个具体元素的指针的话,要加1。否则出错。
程序如下:
#include <iostream> #include <algorithm> #include <vector> #include <iterator> using namespace std; void FlapjackSort(vector<int> &fj) { int n = 0; vector<int>::iterator iter = fj.begin(); while(iter!=fj.end()) { cout<<endl<<"n="; vector<int>::iterator maxFj = max_element(fj.begin(), fj.end()-n); reverse(fj.begin(), maxFj+1); cout<<endl<<" "; for_each(fj.begin(), fj.end(), [](int i)->void {std::cout << i <<" ";}); reverse(fj.begin(), fj.end()-n); cout<<" "; for_each(fj.begin(), fj.end(), [](int i)->void {std::cout << i <<" ";}); n++; iter=fj.begin()+n; } } int main() { int flapjacks[8] = {2,5,7,6,4,8,11,4}; vector<int> fj; for (int i=0; i<sizeof(flapjacks)/sizeof(flapjacks[0]); i++) { fj.push_back(flapjacks[i]); } cout<<"original flapjacks"<<endl; for_each(fj.begin(), fj.end(), [](int i)->void {std::cout << i <<" ";}); cout<<endl; FlapjackSort(fj); cout<<endl<<"after sorting"<<endl; for_each(fj.begin(), fj.end(), [](int i)->void {std::cout << i <<" ";}); return 0; }
程序输出如下:
original flapjacks
2 5 7 6 4 8 11 4
n=0
11 8 4 6 7 5 2 4 4 2 5 7 6 4 8 11
n=1
8 4 6 7 5 2 4 11 4 2 5 7 6 4 8 11
n=2
7 5 2 4 6 4 8 11 4 6 4 2 5 7 8 11
n=3
6 4 4 2 5 7 8 11 5 2 4 4 6 7 8 11
n=4
5 2 4 4
4000
6 7 8 11 4 4 2 5 6 7 8 11
n=5
4 4 2 5 6 7 8 11 2 4 4 5 6 7 8 11
n=6
4 2 4 5 6 7 8 11 2 4 4 5 6 7 8 11
n=7
2 4 4 5 6 7 8 11 2 4 4 5 6 7 8 11
after sorting
2 4 4 5 6 7 8 11
Process returned 0 (0x0) execution time : 0.087 s
Press any key to continue.
看来用STL虽然方便,可是太慢了(可能是涉及到iterator的关系?),直接用写函数max()和reverse()可能快些。
相关文章推荐
- 煎饼(Stacks of Flapjacks,UVa 120)
- UVA120 Stacks of Flapjacks【排序模拟】
- Stacks of Flapjacks 翻煎饼-UVA120 白书第五章
- Uva120 Stacks of Flapjacks 翻煎饼
- (白书训练计划)UVa 120 Stacks of Flapjacks(构造法)
- uva 120 C - Stacks of Flapjacks
- Uva120 Stacks of Flapjacks 翻煎饼
- UVa 120|Stacks of Flapjacks|暴力
- UVA 120 Stacks of Flapjacks 煎饼
- UVa 120 Stacks of Flapjacks【构造法】
- uva 120 Stacks of Flapjacks(练习deque)
- Uva 120 - Stacks of Flapjacks(构造法)
- UVa 120 Stacks of Flapjacks 【排序】
- uva 120 Stacks of Flapjacks(模拟)
- UVa 120 - Stacks of Flapjacks(构造法)
- uva 120 Stacks of Flapjacks(检索)
- UVa 120 Stacks of Flapjacks 摞煎饼 - 插入排序
- uva120 stacks of flapjacks
- Uva120 Stacks of Flapjacks【构造法】【例题8-1】
- UVa 120 - Stacks of Flapjacks (排序)