当前位置: 首页 > backend >正文

PAT 1089 Insert or Merge

在这里插入图片描述
在这里插入图片描述
这一题给出了一个原始的序列,然后给出一个还未完全排的序列,让我们判断采用的是插入排序还是归并排序,并且输出下一趟的排序序列。
思路很简单,只需要模拟排序的过程,然后判断给出的那个未完全排的序列是不是符合其中的一趟即可,并且输出下一趟的排序序列。
因此我们需要对插入排序和归并排序很清楚才行
对于插入排序一文讲透:

算法:插入排序

对于归并排序一文讲透:

算法:归并排序

而解决这一题只需要模拟这两个排序算法即可,我是先判断它是不是插入排序,如果是就输出,如果不是,就让它模拟归并排序,再输出。
完整代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <unordered_map>
#include <limits.h>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
int n;
vector<int> initalsq(105);
vector<int> tempsq(105);
bool isinsert_sort(vector<int>& initalsq,vector<int>& tempsq)
{bool flag=0;for(int i=1;i<n;i++){int k=0;int x=initalsq[i];int j;for(j=i;j>0;j--){if(initalsq[j-1]>x){initalsq[j]=initalsq[j-1];}else{break;}}initalsq[j]=x;if(flag==1){for(int q=0;q<n;q++){if(q!=0)cout<<" ";cout<<initalsq[q];}}if(initalsq==tempsq){flag=1;//说明是插入排序cout<<"Insertion Sort"<<endl;}}if(flag==1){return true;}else{return false;}
}
void merge(vector<int>&a,int step,int n,vector<int>& tempsq)
{vector<int> temp(a);for(int i=0;i+step<n;i+=2*step){int l=i;int m=i+step;int r=min(i+2*step,n);inplace_merge(temp.begin()+l,temp.begin()+m,temp.begin()+r);}a=temp;}
void merge_sort(vector<int>& initalsq,int n,vector<int>& tempsq)
{bool flag=0;for(int i=1;i<n;i*=2){merge(initalsq,i,n,tempsq);if (flag) { for (int k = 0; k < n; k++) {if (k) cout << " ";cout<<initalsq[k];}return;}if (initalsq==tempsq) flag = true;}}
void ismerge_sort(vector<int>& initalsq,vector<int>& tempsq)
{merge_sort(initalsq,n,tempsq);
}
int main()
{//ios::sync_with_stdio(0),cin.tie(0),cout.tie(cin>>n;for(int i=0;i<n;i++){cin>>initalsq[i];}for(int i=0;i<n;i++){cin>>tempsq[i];}vector<int> t=initalsq;if(isinsert_sort(initalsq,tempsq)){}else{cout<<"Merge Sort"<<endl;ismerge_sort(t,tempsq);}return 0;} 

掌握插入排序和归并排序即可,注意这里的归并排序需要写迭代法,迭代法的每一轮恰好是我们需要找到排序中的某一个过程,所以需要记录每一步排完序后的序列,而递归法每一次递归返回的只是一部分,不是向上合并的每一轮的完整状态,因此需要用迭代法来解决。

http://www.xdnf.cn/news/19506.html

相关文章:

  • UBUNTU之Onvif开源服务器onvif_srvd:1、编译
  • 如何使用VMware创建一台Ubuntu机器
  • Shell脚本实用技巧集锦:从时间判断到系统监控
  • 【数据可视化-104】安徽省2025年上半年GDP数据可视化分析:用Python和Pyecharts打造炫酷大屏
  • HTTP/2 多路复用
  • 网络流量分析——熟悉Wireshark
  • 时序数据库国产的有哪些?
  • ​​--flush-logs 的作用:刷新 MySQL 的日志文件(主要是二进制日志 binlog)​
  • 解析简历重难点与面试回答要点
  • 【开题答辩全过程】以 健身爱好者饮食管理小程序为例,包含答辩的问题和答案
  • LeetCode82删除排序链表中的重复元素 II
  • 力扣hot100 | 堆 | 215. 数组中的第K个最大元素、347. 前 K 个高频元素、128. 最长连续序列
  • 《架构师手记:SpringCloud整合Nacos实战·一》
  • Transformer的并行计算与长序列处理瓶颈总结
  • 可编辑115页PPT | 某纸制品制造企业数字化转型战略规划项目建议书
  • 【实验protocol分享】了解流式细胞术
  • 串口通讯个人见解
  • 软考中级【网络工程师】第6版教材 第4章 无线通信网 (下)
  • matlab扫雷小游戏
  • 艾莉丝努力练剑的创作纪念日:星河初启,牧梦长空
  • 企业级主流日志系统架构对比ELKK Stack -Grafana Stack
  • pyside6小项目:进制转换器
  • 【OpenFeign】基础使用
  • Kubernetes一网络组件概述
  • Java比较器
  • 如何在 vscode 上用 git 将项目 push 到远程仓库 and 常用Git 命令
  • 剧本杀小程序系统开发:重塑社交娱乐新生态
  • 【开题答辩全过程】以 基于Spring Boot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
  • 神经网络1——sklearn的简单实现
  • leetcode笔记