pat甲级1089 Insert or Merge (25)、乙级1035 插入与归并(25)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/81150510

欢迎访问我的pat甲级题解目录哦 https://blog.csdn.net/richenyunqi/article/details/84981078
欢迎访问我的pat乙级题解目录哦 https://blog.csdn.net/richenyunqi/article/details/84981369

题目描述

甲级题目描述

pat甲级1089 Insert or Merge (25)题目描述

乙级题目描述

pat乙级1035 插入与归并题目描述

算法设计

显然要编写插入排序和归并排序代码,但是只需表示出每趟排序结果,不必太过注重细节,可以直接使用sort函数对每趟需排序的元素进行排序。先进行插入排序,排序过程中如果没有目标序列,那么必然是归并排序的结果,直接进行归并排序即可。具体实现可见代码。

注意点

不要将原始序列作为一趟排序,插入排序应该从第2个元素开始进行插入,例如原始序列4 3 2 1的第一趟排序为3 4 2 1;原始序列3 4 2 1,第一趟排序为3 4 2 1,第二趟排序为2 3 4 1。同样,归并排序第一趟排序应该是把每2个元素归并在一起。

使用的标准库函数

  • memcpy(dest,source,size):将数组source复制给数组dest,size表示数组source的大小
  • equal(beg1,end1,beg2):比较两个序列对应位置上的元素是否相等,相等则返回true;否则返回false。beg1,end1,beg2均为迭代器,[beg1,end1]确定了序列1的首尾区间,beg2确定了序列2的起始位置

C++代码

#include<bits/stdc++.h>
using namespace std;
int N,A[105],initial[105],target[105];
int main(){
    scanf("%d",&N);
    for(int i=0;i<N;++i)//读取原始序列
        scanf("%d",&initial[i]);
    for(int i=0;i<N;++i)//读取中间序列
        scanf("%d",&target[i]);
    memcpy(A,initial,sizeof(initial));//将原始序列拷贝给A数组
    bool f=false;
    for(int i=1;i<N;++i){//进行插入排序
        sort(A,A+i+1);//第一趟排序应该是排序前两个数,第i趟排序分别排序前i+1个数
        if(equal(A,A+N,target)){//equal是C++标准库中函数,如果两个序列对应位置上的元素都相等,则返回true
            f=true;
            printf("Insertion Sort\n");
            sort(A,A+i+2);//进行下一趟排序
            break;
        }
    }
    if(!f){//不是插入排序
        printf("Merge Sort\n");
        memcpy(A,initial,sizeof(initial));
        for(int i=2;i<N;i*=2){//将每i个元素归并为一个非递减序列
            for(int j=0;j<N;j+=i)
                sort(A+j,j+i<N?A+j+i:A+N);
            if(equal(A,A+N,target)){
                for(int j=0;j<N;j+=i*2)//进行下一趟排序
                    sort(A+j,j+i*2<N?A+j+i*2:A+N);
                break;
            }
        }
    }
    for(int i=0;i<N;++i)//输出下一趟排序结果
        printf("%s%d",i>0?" ":"",A[i]);
    return 0;
}

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭