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

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

这道题我们采用先判断是不是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.kler.cn/news/354277.html

相关文章:

  • 浅谈微前端【qiankun】的应用
  • gaussdb 主备 8 数据库安全学习
  • 深入探索 C++ STL: 高效双向链表 list 的使用与实践
  • Node.js基础(二)
  • 【设计模式-简单工厂】
  • Leetcode 71 Simply Path
  • NET MAUI简介
  • 【算法篇】贪心类(1)(笔记)
  • 基于Python的自然语言处理系列(36):使用PyTorch微调(无需Trainer)
  • 设计模式详解(命令模式)
  • GPT提示词
  • 限制游客在wordpress某分类下阅读文章的数量
  • 【Redis_Day1】分布式系统和Redis
  • LeetCode刷题日记之贪心算法(一)
  • Unity3D URP画面品质的上限如何详解
  • 【HarmonyOS NEXT】服务端向终端推送消息——获取Push Token
  • 详细指南:如何使用WildCard升级到ChatGPT 4.0
  • 【React】使用脚手架或Vite包两种方式创建react项目
  • 基于NXP LS1023+FPGA的嵌入式解决方案
  • 计算机视觉算法的演进与应用:从基础理论到前沿技术