1098 Insertion or Heap Sort测试样例2
原题链接
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 200;
int N;
int initnum[maxn];
int nownum[maxn];
int nextnum[maxn];
void print(int num[]){
for (int i = 1; i <= N; i++)
{
if(i - 1)
cout<<' ';
cout<<num[i];
}
}
bool equal(int num[]){
for (int i = 1; i <= N; i++)
{
if(num[i] != nownum[i])
return false;
}
return true;
}
bool judgeInsert(){
for (int i = 1; i <= N; i++)
nextnum[i] = initnum[i];
for (int i = 2; i <= N; i++)
{
sort(nextnum + 1,nextnum + 1 + i);
if(equal(nextnum)){
cout<<"Insertion Sort\n";
sort(nextnum + 1,nextnum + 1 + i + 1);
print(nextnum);
return true;
}
}
return false;
}
void downAdjust(int low,int high){
int i = low,j = low * 2;
while (j <= high)
{
if(j + 1 <= high && initnum[j + 1] > initnum[j])
j++;
if(initnum[j] > initnum[i]){
swap(initnum[i],initnum[j]);
i = j;
j *= 2;
}else
break;
}
}
void creatheap(){
for (int i = N/2; i > 0; i--)
downAdjust(i,N);
}
void heapsort(){
creatheap();
bool flag = false;
for (int i = N; i > 1; i--)
{
swap(initnum[1],initnum[i]);
downAdjust(1,i - 1);
if(flag){
cout<<"Heap Sort\n";
print(initnum);
return;
}
if(equal(initnum))
flag = true;
}
}
int main(){
cin>>N;
for (int i = 1; i <= N; i++)
cin>>initnum[i];
for (int i = 1; i <= N; i++)
cin>>nownum[i];
if(!judgeInsert()){
heapsort();
}
return 0;
}
注意
对于插入排序,要跳过第一个点才有可能拿到正确的结果,
否则测试样例2错误。
该问题测试样例如下:
4
3 4 2 1
3 4 2 1
-----------
正确答案:
Insertion Sort
2 3 4 1
578

被折叠的 条评论
为什么被折叠?



