您的位置:首页 > 其它

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要求下一阶段的状态和输入的中间排序状态不一样,也就是说如果下一次排序的结果和现在的排序结果一样,则继续求下一次排序直到排序结果和输入的中间排序结果不一样为止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息