1098. Insertion or Heap Sort (25)
2016-07-10 16:45
537 查看
#include <iostream> #include<vector> #include<algorithm> using namespace std; void HeapAdjust(vector<int>& numbers, int idx, int length) { // 根结点的序号为0而不是1,所以i结点左孩子和右孩子分别为2i+1和2i+2 for(int i=2*idx+1; i<length; i=2*idx+1) { if(i+1<length && numbers[i]<numbers[i+1]) i++; if(numbers[idx] > numbers[i]) break; swap(numbers[idx], numbers[i]); idx = i; } } int main() { ios::sync_with_stdio(false); int n; cin>>n; vector<int> firstState(n); vector<int> secState(n); vector<int>::iterator it; for(int i=0;i<n;i++) cin>>firstState[i]; for(it=secState.begin();it<secState.end();it++) cin>>*it; int devide=n-1; while(devide>=0&&firstState[devide]==secState[devide]) devide--; //devide 是最后一个相同元素的下标 bool isInsert=true; for(int i=1;i<devide;i++) if(secState[i-1]>secState[i]) { isInsert=false; break; } vector<int> nextState = secState; if(isInsert) { for(int i=devide+1; i<n; i++) { sort(nextState.begin(), nextState.begin()+i); if(nextState != secState) { break; } } } else { int last = n-1; while(last>=0 && secState[last] >= secState[0]) { last--; } swap(secState[0], secState[last]); HeapAdjust(secState, 0, last); cout << "Heap Sort" << endl; } for(int i=0; i<n-1; i++) { cout << secState[i] << " "; } cout << secState[n-1]; return 0; }
注意:在计算下一阶段时,PAT要求下一阶段的状态和输入的中间排序状态不一样,也就是说如果下一次排序的结果和现在的排序结果一样,则继续求下一次排序直到排序结果和输入的中间排序结果不一样为止。
相关文章推荐
- 插入排序
- 堆排序
- C#堆排序实现方法
- C++ Vector用法详解
- 详解C++编程中的vector类容器用法
- 详解C++中的vector容器及用迭代器访问vector的方法
- php实现插入排序
- 大家注意vector, list, set, map成员函数erase
- Java数据结构及算法实例:插入排序 Insertion Sort
- java中vector与hashtable操作实例分享
- C++ vector删除符合条件的元素示例分享
- C++中vector容器的常用操作方法实例总结
- 使用C语言实现vector动态数组的实例分享
- 图文详解Heap Sort堆排序算法及JavaScript的代码实现
- php堆排序实现原理与应用方法
- C++ Vector用法深入剖析
- vector与map的erase()函数详细解析
- javascript数据结构之双链表插入排序实例详解
- 深入理解C++中的vector类的用法及特性
- vector,map,list,queue的区别详细解析