【题意】
给出一个初始数列和一个部分排序的数列,判断所用的是插排还是归并排序,并输出下一轮排序的结果
【思路】
具体排序可用sort代替,总体思想是该种排序方式即可
【注意点】
插排的第一轮至少得是两个数,不然有个1分的点过不去,可能是这么一种情况:
初始数列:1 3 2 0
部分排序序列:1 3 2 0
若插排第一轮就一个数(即不排序),那么下一轮结果还是1 3 2 0;
但若第一轮是两个数,依然满足部分排序结果是1 3 2 0,但下一轮就是1 2 3 0了
总之不应该进行无意义的一轮排序(即参与排序的数只有一个)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(int argc, char const *argv[])
{
int n;
vector<int> init,changed;
cin >> n;
init.resize(n);
changed.resize(n);
for(int i=0; i<n; i++){
cin >> init[i];
}
for(int i=0; i<n; i++){
cin >> changed[i];
}
vector<int> tmp = init;
//Insertion Sort
for(int i=2; i<n; i++){
sort(tmp.begin(),tmp.begin()+i);
if(tmp==changed){
cout << "Insertion Sort" << endl;
sort(tmp.begin(),tmp.begin()+i+1);
for(int j=0; j<n; j++){
cout << tmp[j];
if(j<n-1){
cout << " ";
}
}
system("pause");
return 0;
}
}
//Merge Sort
int length = 1;
while(length<=n){
length *= 2;
for(int left=0; left<n; left+=length){
int right = min(left+length,n);
sort(init.begin()+left,init.begin()+right);
}
if(init==changed){
cout << "Merge Sort" << endl;
length *= 2;
for(int left=0; left<n; left+=length){
int right = min(left+length,n);
sort(init.begin()+left,init.begin()+right);
}
for(int j=0; j<n; j++){
cout << init[j];
if(j<n-1){
cout << " ";
}
}
break;
}
}
system("pause");
return 0;
}