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

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.dtcms.com/a/361399.html

相关文章:

  • G156HAN04.0 宽温域高亮工业屏技术白皮书
  • 矩阵中寻找好子矩阵
  • leetcode5( 多数元素)
  • 力扣 23 912题(堆)
  • MySQL 体系结构
  • 09.《路由基础知识解析和实践》
  • 【C#实战】使用ListBox控件与生成器模式构建灵活多变的金融资产管理系统
  • 金融数据安全
  • 云原生新手入门完整学习指南
  • 基于单片机智能家居语音控制系统
  • 《IC验证必看|随机稳定性 / 再现性》
  • 手把手教你搭建 UDP 多人聊天室(附完整源码)
  • 网络层和数据链路层
  • 【LeetCode热题100道笔记+动画】乘积最大子数组
  • 构建深度学习音频识别模型:从数据预处理到性能评估
  • PitVis-2023挑战赛:内镜下垂体瘤手术视频中的手术流程识别|文献速递-深度学习人工智能医疗图像
  • 1. 从零开始搭建微服务架构1.0(登录模块)
  • 安科瑞微电网智慧能源平台:构建源网荷储一体化新型电力系统
  • RAG初筛混合方案 - bm25+vector
  • 大规模异构数据挖掘与数据架构
  • 56_基于深度学习的X光安检危险物品检测系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • 无需服务器也能建网站:Docsify+cpolar让技术文档分享像写笔记一样简单
  • Typescript入门-泛型讲解
  • Ansible 变量全解析与实践
  • UniApp + SignalR + Asp.net Core 做一个聊天IM,含emoji 表情包
  • 53_基于深度学习的野生菌菇检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • 通义灵码+支付 MCP:30 分钟实现创作打赏智能体
  • 【算法】124.二叉树中的最大路径和--通俗讲解
  • React前端开发笔记合集
  • Kubernetes集群升级与etcd备份恢复指南