1089 Insert or Merge (插入排序,相邻归并排序,附模拟实现)

注意点1:判断插入排序不能从头开始判断是否为目标数组,

比如:初始为1 2 3 4 3,目标数组也为1 2 3 4 3,则如果是从头开始推的,则下一步会变成1 2 3 4 3,而下一步应该是 1 2 3 3 4。所以我们应该从第一个无序的位置开始排序。也就是从最后一个3开始排序判断目标数组。

注意点2:题目中的归并排序为相邻归并(递推归并),而非中分归并(递归归并)。

技巧点:排序可以用sort减少思考步骤。

常规模拟版

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[110],b[110],c[110];
int n;
bool check(){
    for(int i=0;i<n;i++){
        if(c[i]!=b[i])return 0;
    }
    return 1;
}
void print(){
    for(int i=0;i<n;i++){
        cout<<c[i];
        if(i!=n-1)cout<<' ';
    }
}
bool insert(){
    bool flag=0;
    for(int i=1;i<n;i++){
        //找到第一个无序的位置排序。
        if(c[i-1]<=c[i])continue;
        if(check())flag=1;
        int pos=i;
        int temp=c[i];
        while(pos>0&&c[pos-1]>temp){
            c[pos]=c[pos-1];
            pos--;
        }
        c[pos]=temp;
        if(flag)return 1;
    }
    return 0;
}
void merge(){
    bool flag=0;
    for(int len=2;len<=n;len*=2){
        if(check())flag=1;
        for(int l=0;l<n;l+=len){
            int r=min(n-1,l+len-1);
            int mid=l+len/2-1;
            int i=l,j=mid+1;
            vector<int>temp;
            while(i<=mid&&j<=r){
                if(c[i]<=c[j])temp.push_back(c[i++]);
                else temp.push_back(c[j++]);
            }
            while(i<=mid)temp.push_back(c[i++]);
            while(j<=r)temp.push_back(c[j++]);
            for(i=l,j=0;i<=r;i++,j++){
                c[i]=temp[j];
            }
        }
        if(flag)return ;
    }
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++)cin>>b[i];
    memcpy(c,a,sizeof a);
    if(insert()){
        cout<<"Insertion Sort"<<endl;
        print();
    }else {
        memcpy(c,a,sizeof a);
        merge();
        cout<<"Merge Sort"<<endl;
        print();
    }
}

sort版

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[110],b[110],c[110];
int n;
bool check(){
    for(int i=0;i<n;i++){
        if(c[i]!=b[i])return 0;
    }
    return 1;
}
void print(){
    for(int i=0;i<n;i++){
        cout<<c[i];
        if(i!=n-1)cout<<' ';
    }
}
bool insert(){
    bool flag=0;
    for(int i=1;i<n;i++){
        //找到第一个无序的位置排序。
        if(c[i-1]<=c[i])continue;
        if(check())flag=1;
        sort(c,c+i+1);
        if(flag)return 1;
    }
    return 0;
}
void merge(){
    bool flag=0;
    for(int len=2;len<=n;len*=2){
        if(check())flag=1;
        for(int i=0;i<n;i+=len){
            int j=min(n,i+len);
            sort(c+i,c+j);
        }
        if(flag)return ;
    }
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++)cin>>b[i];
    memcpy(c,a,sizeof a);
    if(insert()){
        cout<<"Insertion Sort"<<endl;
        print();
    }else {
        memcpy(c,a,sizeof a);
        merge();
        cout<<"Merge Sort"<<endl;
        print();
    }
}
相关推荐
chaser&upper几秒前
矩阵革命:在 AtomGit 解码 CANN ops-nn 如何构建 AIGC 的“线性基石”
程序人生·算法
weixin_499771559 分钟前
C++中的组合模式
开发语言·c++·算法
iAkuya40 分钟前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼40 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck42 分钟前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆1 小时前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型
java干货1 小时前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
皮皮哎哟1 小时前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒1 小时前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
vortex51 小时前
几种 dump hash 方式对比分析
算法·哈希算法