题意
给定原数组和中间生成数组,问该数组是插入排序还是归并排序的中间生成数组,并输出下一个状态结果。
思路
了解两种排序方法的机制进行模拟。插入排序直接码即可,归并排序可以用sort讨巧。用vector,判数组是否相等很方便。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
vector<int> init(n);
for (int& e : init) cin >> e;
vector<int> cent(n);
for (int& e : cent) cin >> e;
vector<int> tmp = init;
bool flag = false;
for (int i = 1; i < n; ++i) {
for (int j = i; j > 0; --j) {
if (tmp[j] < tmp[j - 1])
swap(tmp[j], tmp[j - 1]);
else
break;
}
if (flag) {
for (int j = 0; j < n; ++j)
cout << tmp[j] << (j == n - 1 ? '\n' : ' ');
break;
}
if (tmp == cent) {
cout << "Insertion Sort\n";
flag = true;
}
}
tmp = init;
flag = false;
for (int i = 1; ; ++i) {
for (int j = 0, seg = 1 << i; j < n; j += seg) {
if (j + seg <= n)
sort(tmp.begin() + j, tmp.begin() + j + seg);
else
sort(tmp.begin() + j, tmp.end());
}
if (flag) {
for (int j = 0; j < n; ++j)
cout << tmp[j] << (j == n - 1 ? '\n' : ' ');
break;
}
if (tmp == cent) {
cout << "Merge Sort\n";
flag = true;
}
if ((1 << i) >= n) break;
}
return 0;
}
HINT
不定时更新更多题解,Basic Level 全部AC代码,详见 link ! ! !