【PAT】A1089 Insert or Merge (插入、归并排序)
@(PAT)
链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805377432928256
思路:
1. 题目的意思是给出数组s1和数组s2,对s1进行插入或者归并排序,某个步骤后的结果是s2,要根据s2判断是哪种排序,然后给出再进行一种相应排序的步骤后的结果。
2. 思路不难,对数组进行插入排序,每个步骤的结果对比s2,如果相同就为插入排序,不然就为归并排序,进行归并排序到相应步骤即可。
3. 注意一点是题目中的中间数组不包含初始数组,所以一开始的结果不能进行比较。
4. 这道题目的重点还是插入排序和归并排序(非递归)的编写。
My AC code:
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define N 111
int n;
vector<int> init(N);
vector<int> init2(N);
vector<int> tar(N);
bool compare(vector<int> v1, vector<int> v2) {
for (int i = 0; i < n; i++) {
if (v1[i] != v2[i]) return false;
}
return true;
}
bool insertSort() {
bool ifSame = false;
for (int i = 1; i < n; i++) {
if (i != 1) {
if (compare(tar, init2)== true) {
ifSame = true;
}
}
int temp = init2[i];
int j = i;
while (j > 0 && temp < init2[j - 1]) {
init2[j] = init2[j - 1];
j--;
}
init2[j] = temp;
if (ifSame == true) {
return true;
}
}
return false;
}
bool mergeSort() {
bool ifSame = false;
for (int step = 2; step / 2 <= n; step *= 2) {
if (step != 2) {
if (compare(tar, init2) == true) {
ifSame = true;
}
}
for (int i = 0; i < n; i += step) {
vector<int>::iterator it1;
vector<int>::iterator it2;
it1 = init2.begin() + i;
it2 = init2.begin() + min(i + step, n);
sort(it1, it2);
}
if (ifSame == true) {
return true;
}
}
return false;
}
void mPrint() {
for (int i = 0; i < n; i++) {
if (i == 0) {
printf("%d", init2[i]);
}
else {
printf(" %d", init2[i]);
}
}
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &init[i]);
init2[i] = init[i];
}
for (int i = 0; i < n; i++) {
scanf("%d", &tar[i]);
}
bool ifInsert= insertSort();
if (ifInsert == true) {
printf("Insertion Sort\n");
mPrint();
}
else {
for (int i = 0; i < n; i++) {
init2[i] = init[i];
}
mergeSort();
printf("Merge Sort\n");
mPrint();
}
}