欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 浙大数据结构:09-排序2 Insert or Merge

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

2025/5/2 17:11:41 来源:https://blog.csdn.net/qq_74924951/article/details/142924469  浏览:    关键词:浙大数据结构: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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词