1098 Insertion or Heap Sort测试样例2

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值