插入还是堆排序、插入还是归并

根据维基百科:

插入排序迭代,每次将一个插入元素插入到排好序的输出序列中,每次迭代插入排序都会从输入数据中移除一个元素,并在已排好序的序列中找到它所属的位置,然后将其插入。直到没有输入元素剩余为止。

堆排序将其输入分为已排序和未排序两个区域,并通过提取未排序区域中的最大元素并将其移至已排序的区域来迭代地缩小未排序的区域。它通过使用堆数据结构而非线性时间搜索来找到最大值。

现在,给定初始序列,以及经过某种排序方法多次迭代后的序列,请你判断我们使用的哪一种排序方法。

输入格式
第一行包含整数 N,表示序列中整数个数。

第二行包含 N 个整数表示初始序列。

第三行包含 N 个整数表示经过若干次迭代后的序列。

假定排序的目标序列总是递增的。

输出格式
第一行输出 Insertion Sort 或 Heap Sort,以指明所采用的具体排序方法。

运用此方法再进行一次迭代,并在第二行输出本次迭代后的序列。

数据保证答案唯一。

数据范围
1≤N≤100
输入样例1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
输出样例1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
输入样例2:
10
3 1 2 8 7 5 9 4 6 0
6 4 5 1 0 3 2 7 8 9
输出样例2:
Heap Sort
5 4 3 1 0 2 6 7 8 9

#include <bits/stdc++.h>

using namespace std;
int a[10010],b[10010],work[10010];
int n;
int siz;
bool judge()
{
    for(int i=0;i<n;i++)
    if(work[i]!=b[i])
    return false;
    return true;
}
void insert_sort(int k)
{
    for(int i=0;i<n;i++)
    work[i] = a[i];
    sort(work,work+k);

}
void head_sort(int x)
{
    
    int temp = x;
    if(x*2+1<=siz&&work[x*2+1]>work[temp])
    temp = x*2+1;
    if(x*2+2<=siz&&work[x*2+2]>2work[temp])
    temp = x*2+2;
    
    if(temp!=x)
    {
        swap(work[temp],work[x]);
        head_sort(temp);
    }
    
    
}
int main()
{
    cin >> n;
    siz=n-1;
    for(int i=0;i<n;i++)
    cin >>a[i];
    for(int i=0;i<n;i++)
    cin >> b[i];
    for(int i=n;i>=1;i--)
    {
        insert_sort(i);
        if(judge())
        {
            cout <<"Insertion Sort"<<endl;
            insert_sort(i+1);
            for(int i=0;i<n;i++)
            {
                if(i)
                cout <<" ";
                cout <<work[i];
            } 
            return 0;
        }
       
    }
    cout <<"Heap Sort"<<endl;
    for(int i=0;i<n;i++)
    work[i] =a[i];
    for(int i=(n-1)/2;i>=0;i--)
     head_sort(i);
    for(int i=1;i<=n;i++)
    {
        head_sort(0);
        
       
        if(judge())
        {
            swap(work[0],work[siz--]);
            head_sort(0);
            for(int i=0;i<n;i++)
            {
                if(i)
                cout <<" ";
                cout <<work[i];
            } 
            return 0;
        } swap(work[0],work[siz--]); 
    }
    
    return 0;
}

根据维基百科:

插入排序迭代,每次将一个插入元素插入到排好序的输出序列中,每次迭代插入排序都会从输入数据中移除一个元素,并在已排好序的序列中找到它所属的位置,然后将其插入。直到没有输入元素剩余为止。

归并排序的工作方式如下:将未排序的序列划分为 N 个子序列,每个子序列包含 1 个元素(将 1 个元素的序列视为已排序)。然后重复合并两个相邻的子序列以产生新的排序子序列,直到仅剩 1 个子序列为止。

现在,给定初始序列,以及经过某种排序方法多次迭代后的序列,请你判断我们使用的哪一种排序方法。

输入格式
第一行包含整数 N,表示序列中整数个数。

第二行包含 N 个整数表示初始序列。

第三行包含 N 个整数表示经过若干次迭代后的序列。

假定排序的目标序列总是递增的。

输出格式
第一行输出 Insertion Sort 或 Merge Sort,以指明所采用的具体排序方法。

运用此方法再进行一次迭代,并在第二行输出本次迭代后的序列。

数据保证答案唯一。

数据范围
1≤N≤100
输入样例1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
输出样例1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
输入样例2:
10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6
输出样例2:
Merge Sort
1 2 3 8 4 5 7 9 0 6

#include <bits/stdc++.h>

using namespace std;
int a[10010],b[10010],work[10010];
int n;
int flag=0;
bool judge()
{
    for(int i=0;i<n;i++)
    {
     if(work[i]!=b[i])
     return false;
    }
    return true;
}
void insert_sort(int k)
{
     for(int i=0;i<n;i++)
        work[i]=a[i];
    sort(work,work+k);
    
}
void merge_sort(int k)
{
    for(int i=0;i<n;i++)
    work[i] = a[i];
    for(int i=0;i<n;i+=k)
    {
        if(i+k<=n)
        sort(work+i,work+i+k);
        else
        sort(work+i,work+n);
    }
}
int main()
{
    cin >> n;
    for(int i=0;i<n;i++)
    cin>>a[i];
    for(int i=0;i<n;i++)
    cin >>b[i];
       for(int i=n;i>=1;i--)
    {
        insert_sort(i);
        if(judge()==true)
        {
            cout <<"Insertion Sort"<<endl;
            insert_sort(i+1);
            for(int j=0;j<n;j++)
            {
                cout <<work[j];
                if(j!=n-1)
                    cout <<" ";   
            }
            return 0;
        }
    }
    if(!flag)
    {
        for(int i=1;i<n;i*=2)
        {
            merge_sort(i);
            if(judge())
            {
                cout <<"Merge Sort"<<endl;
                merge_sort(2*i);
                for(int i=0;i<n;i++)
                {
                    if(i)
                        cout <<" ";cout <<work[i];
                }
                
                return 0;
            }
        }
    }
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值