浙大数据结构:09-排序2 Insert or Merge

news2025/1/15 8:30:19

这道题我们采用先判断是不是insert如果不是再用merge算一下
机翻

1、条件准备

首先存元素个数n,然后oldnum存原始数组,newnum存新数组

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define endl '\n'

int n;
vector<int> oldnum;
vector<int> newnum;

2、主函数

先输入数据,然后判断是不是insert,如果不是则调用merge 来判断

int main()
{
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>n;
  for(int i=0;i<n;i++)
   {int a;cin>>a;oldnum.push_back(a);}
   for(int i=0;i<n;i++)
  {int a;cin>>a;newnum.push_back(a);}
  if(!judgeinsert())
     merge();

  return 0;
}

3、judgeinsert函数

首先递增遍历一下,直到不递增为止 ,然后比对后面的元素是否都一样,不一样则为merge。
否则为insert,然后根据tag的值来再迭代一次插入排序,然后输出。

bool judgeinsert()
{
  int tag=0;
  for(int i=0;i<n-1;i++)
     if(newnum[tag]<=newnum[tag+1])tag++;
       tag++;
     for(int i=tag;i<n;i++)
      if(oldnum[i]!=newnum[i])return 0;
      cout<<"Insertion Sort\n";
      int tmp=newnum[tag]; int i;
      for( i=tag-1;i>=0&&newnum[i]>tmp;i--)
          newnum[i+1]=newnum[i];
      newnum[i+1]=tmp;
     for(int i=0;i<n-1;i++)
      cout<<newnum[i]<<' ';
      cout<<newnum[n-1];
      return 1;
}

4、numofmerge函数

这个函数是对每lun个元素进行排序,相当于对oldnum数组分块,是merge中的一步,但这里我们单拎出来并只是判断是否迭代到当前了。

int  numofmerge(int lun)
{
    vector<int> tmpnew=oldnum;
    for(int i=0;i<tmpnew.size();i+=lun)
      if(i+lun>tmpnew.size())sort(tmpnew.begin()+i,tmpnew.end());
     else  sort(tmpnew.begin()+i,tmpnew.begin()+i+lun);
    
     for(int i=0;i<tmpnew.size();i++)
      if(newnum[i]!=tmpnew[i])return 0;
     
     return 1;
}

5、merge函数

merge中不同次之间其实就是对2的多少次幂分块再排序,我们从1开始,迭代到按num数量分块的排序产生的数组与newnum一样,然后输出。
接着我们再迭代一次,最后输出。
注意尾部不足num的数量的块则直接到end就行

void merge()
{
   int num=1;
   for(;!numofmerge(num);num*=2);
   cout<<"Merge Sort"<<endl;
   num*=2;
 for(int i=0;i<newnum.size();i+=num)
      if(i+num>newnum.size())sort(newnum.begin()+i,newnum.end());
      else  sort(newnum.begin()+i,newnum.begin()+i+num);
    
    for(int i=0;i<newnum.size()-1;i++)
     cout<<newnum[i]<<' ';
     cout<<newnum[n-1];
}

6、总结

这道题难度还行,也算比较有意思的一道题
完整代码如下

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define endl '\n'

int n;
vector<int> oldnum;
vector<int> newnum;

bool judgeinsert()
{
  int tag=0;
  for(int i=0;i<n-1;i++)
     if(newnum[tag]<=newnum[tag+1])tag++;
       tag++;
     for(int i=tag;i<n;i++)
      if(oldnum[i]!=newnum[i])return 0;
      cout<<"Insertion Sort\n";
      int tmp=newnum[tag]; int i;
      for( i=tag-1;i>=0&&newnum[i]>tmp;i--)
          newnum[i+1]=newnum[i];
      newnum[i+1]=tmp;
     for(int i=0;i<n-1;i++)
      cout<<newnum[i]<<' ';
      cout<<newnum[n-1];
      return 1;
}
int  numofmerge(int lun)
{
    vector<int> tmpnew=oldnum;
    for(int i=0;i<tmpnew.size();i+=lun)
      if(i+lun>tmpnew.size())sort(tmpnew.begin()+i,tmpnew.end());
     else  sort(tmpnew.begin()+i,tmpnew.begin()+i+lun);
    
     for(int i=0;i<tmpnew.size();i++)
      if(newnum[i]!=tmpnew[i])return 0;
     
     return 1;
}
void merge()
{
   int num=1;
   for(;!numofmerge(num);num*=2);
   cout<<"Merge Sort"<<endl;
   num*=2;
 for(int i=0;i<newnum.size();i+=num)
      if(i+num>newnum.size())sort(newnum.begin()+i,newnum.end());
      else  sort(newnum.begin()+i,newnum.begin()+i+num);
    
    for(int i=0;i<newnum.size()-1;i++)
     cout<<newnum[i]<<' ';
     cout<<newnum[n-1];
}
int main()
{
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>n;
  for(int i=0;i<n;i++)
   {int a;cin>>a;oldnum.push_back(a);}
   for(int i=0;i<n;i++)
  {int a;cin>>a;newnum.push_back(a);}
  if(!judgeinsert())
     merge();

  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSD | (三)NAND闪存(上)

文章目录 &#x1f4da;闪存基本原理&#x1f407;存储单元及相关操作&#x1f407;闪存类型&#x1f407;闪存组织结构&#x1f407;擦、写、读操作&#x1f407;阈值电压分布图 &#x1f4da;闪存基本原理 &#x1f407;存储单元及相关操作 闪存是一种非易失性存储器&#x…

ArkTS中的几个易错问题

问题1&#xff1a;copyWithin的乱用问题 由于鸿蒙开发者很多可能是安卓转的&#xff0c;在安卓侧尤其是kotlin写手觉得copyOfRange很好用&#xff0c;复制数组的某一段数据就用copyOfRange&#xff0c;而copyWithin其实不是同等作用。 下面是AI对copyWithin的解释&#xff1a…

SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪

SpringBoot教程&#xff08;三十二&#xff09; | SpringBoot集成Skywalking链路跟踪 Skywalking是什么&#xff1f;Skywalking与JDK版本的对应关系Skywalking下载Skywalking 数据存储Skywalking 的启动部署探针方式一&#xff1a;IDEA 部署探针方式二&#xff1a;Java 命令行启…

101 - Lecture 7

回顾冯诺依曼模型&#xff08;von Neumann Model&#xff09;&#xff0c;这是现代计算机体系结构的基础。以下是该模型的关键概念&#xff1a; 1.通用计算机&#xff1a; • 冯诺依曼提出的计算机是通用机器&#xff08;general- purpose&#xff09;&#xff0c;可以通过可…

如何防止架构师PM化?

目录标题 导读引言&#xff1a;什么是架构师PM化架构师PM化的特点亲力操刀的实质性工作越来越少更喜欢拉会催进度越来越难直接回答问题喜欢流程 架构师PM化的危害对项目的危害对组织的危害对架构师个人的危害对研发同学的危害 如何防止架构师PM化组织上要提倡做实事个人上要做点…

MySQL UDF提权原理

文章目录 前言一、MySQL架构二、什么是UDF三、UDF提权原理四、MSF实战参考 前言 看了许多视频和文章&#xff0c;对UDF提权讲得都不是很清楚&#xff0c;遂搜索了一下MySQL的基础知识&#xff0c;总结了一下&#xff0c;供各位初学的师傅参考。 一、MySQL架构 首先&#xff…

Broken pipe异常分析及处理

问题出现&#xff1a;生产上运行的系统业务正常&#xff0c;当在查询数据时&#xff0c;出现后台异常&#xff0c;检查后台日志出现Broken Pipe异常&#xff1b; 如图示&#xff1a; Broken Pipe定义&#xff1a;通常发生在服务器端尝试向已关闭的套接字&#xff08;客户端/端…

Datawhale 组队学习 文生图 Prompt攻防 task02随笔

往期task01链接&#xff1a;task01笔记 本期我们继续从赛季的评价方法切入&#xff0c;探讨如何通过大模型生成更加多样的提示词&#xff0c;让得分更高。 赛题评价方法 结合赛题的要求&#xff0c;赛题文生图大模型服务的全链路框架如下所示&#xff1a; 给定文本prompt&am…

盘点超好用的 Windows 录屏软件,轻松记录屏幕精彩

在当今数字化信息高速流转的时代&#xff0c;屏幕录制已经成为我们日常工作、学习和娱乐中不可或缺的一项技能。如果你是微软电脑&#xff0c;正好我今天想要介绍的就是windows怎么录屏相关工具的操作&#xff0c;感兴趣就继续往下看吧。 1.FOXIT录屏大师 链接直达&#xff1…

【机器学习(十三)】零代码开发案例之股票价格预测分析—Sentosa_DSML社区版

文章目录 一、背景描述二、Sentosa_DSML社区版算法实现(一) 数据读入(二) 特征工程(三) 样本分区(四) 模型训练和评估(五) 模型可视化 三、总结 一、背景描述 股票价格是一种不稳定的时间序列,受多种因素的影响。影响股市的外部因素很多,主要有经济因素、政治因素和公司自身因素…

开源:轻量级异步编排框架

前言 为了更快、更方便的对方法实现异步并排调用&#xff0c;因此实现了一个通过注解就可对方法/类进行异步调用的轻量级异步并排框架。 项目地址&#xff1a;https://gitee.com/madaoEE/my-async 介绍 一个简单实现的异步框架&#xff0c;通过注解对方法、类对象添加异步操…

SpringBoot实现的人事信息管理平台:技术与应用

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

MATLAB代码解析:利用DCGAN实现图像数据的生成

摘要 经典代码&#xff1a;利用DCGAN生成花朵 MATLAB官方其实给出了DCGAN生成花朵的示范代码&#xff0c;原文地址&#xff1a;训练生成对抗网络 (GAN) - MATLAB & Simulink - MathWorks 中国 先看看训练效果 训练1周期 训练11周期 训练56个周期 脚本文件 为了能让各位…

数据库初体验

这两天我学习了数据库的一点知识&#xff0c;我觉得最大的不同就是数据库的代码只能一行一行的运行。 接下来记录我学的东西吧。 第一步 肯定是一些定义知识啦&#xff0c;就不记录了 有一些写一下&#xff0c;数据库的分类为关系型数据库和非关系型数据库 关系型数据库是把复…

Firefox火狐浏览器打开B站视频时默认静音

文章目录 环境问题解决办法 环境 Windows 11家庭版Firefox浏览器 131.0.2 (64 位) 问题 用Firefox浏览器打开B站的视频时&#xff0c;默认是静音播放的&#xff1a; 而其它浏览器&#xff0c;比如Chrome和Edge&#xff0c;默认是带声音播放的。 虽然不是什么大问题&#xf…

工具篇:(一)MacOS 下使用 Navicat 管理 MySQL 数据库:详细图文教程与常见问题解决

MacOS 下使用 Navicat 管理 MySQL 数据库&#xff1a;详细图文教程与常见问题解决 在这篇文章中&#xff0c;我将分享如何在 macOS 上使用 Navicat 来管理 MySQL 数据库。这是一份详细的教程&#xff0c;包括 Navicat 的下载、安装、配置以及使用步骤&#xff0c;并附上亲测的…

优化UVM环境(二)-将error/fatal红色字体打印,pass绿色字体打印

书接上回&#xff1a; 优化UVM环境&#xff08;一&#xff09;-环境结束靠的是timeout&#xff0c;而不是正常的objection结束 将error/fatal红色字体打印&#xff0c;pass绿色字体打印 红色字体的error&#xff1a; 31表示字体颜色是红色 1m表示加粗 绿色字体的pass&#…

高可用之限流-05-slide window 滑动窗口

限流系列 开源组件 rate-limit: 限流 高可用之限流-01-入门介绍 高可用之限流-02-如何设计限流框架 高可用之限流-03-Semaphore 信号量做限流 高可用之限流-04-fixed window 固定窗口 高可用之限流-05-slide window 滑动窗口 高可用之限流-06-slide window 滑动窗口 sen…

ReferenceError: MutationEvent is not defined

解决&#xff1a;关闭tampermonkey&#xff08;篡改猴&#xff09;插件后也不可以&#xff0c;移除tampermonkey&#xff08;篡改猴&#xff09;插件仔刷新就可以了

Linux:Ubuntu系统开启SSH服务

在Ubuntu上开启SSH服务&#xff0c;可以按照以下步骤进行&#xff1a; 1.安装OpenSSH服务 如果你还没有安装OpenSSH服务&#xff0c;可以使用以下命令安装&#xff1a; sudo apt update sudo apt install openssh-server2. 启动SSH服务 安装完成后&#xff0c;启动SSH服务&a…