【PAT】1089 Insert or Merge 针对 24分、测试点二,测试点三 来说说我的遭遇
思想:最简单的思路,最清晰的思路,不用思考的思路就这了。直接暴力,每排一次就比较一次。这里说一下vector可以直接使用=号来判断两个数组是否相同。
可以直接判断比较的啊啊啊!!!
vector<int> v1;
vector<int> v2;
if(v1==v2)
还有就是插入排序和归并排序,在做OJ的时候大家就不必要直接实现它们了,可以对数组的部分元素进行sort就可以了,可以减少大家大量的代码量,思考量。
例如:插入排序的插入操作不就可以直接利用sort进行吗?还有归并排序,进行两两归并的时候不是也可以直接sort一下吗?
关于测试点二:大家记住啦,插入排序是从第二个开始排序的,不要从第一个开始排,就一个元素还排个dei~。我这个憨憨就是从第一个元素开始排序,导致测试点2过不去。下面我来给大家一个测试案例,
关于测试点三:考查的是归并排序的边界条件,在我代码的注释里面。
32行代码处的边界条件
这个地方必须是step/2<N,不然有测试点3过不去。大家想想啊,假如你写成step<N;
如果(我说的是如果)你的N等于15,在某一次你的step = 8,那么你在sort前8个元素
和后7个元素后,你的step*2 后就大于N了,就不会做最后一轮归并了。所以写成step/2
的目的是为了保证整个数组都能被排序完。
10
1 7 2 9 5 4 3 0 12 6
1 7 2 9 5 4 3 0 12 6
输出应该是:
1 2 7 9 5 4 3 0 12 6
如果你直接从第一个元素开始排序的输出的是:
1 7 2 9 5 4 3 0 12 6
显然错了有木有~
下面附上我这个渣渣的AC带代码:
代码精简精简应该40多行就够了。
#include<bits/stdc++.h>
using namespace std;
vector<int> v, result, ans, _ans;
int N;
//与插入排序进行比较。
void INSERT_SORT() {
int flag = 1;
//插入排序是从第二个节点开始排序的,一开始我写的是从第一个开始排的。
//导致通不过测试点2。
//for (int i = 1; i <= N; i++)
for (int i = 2; i <= N; i++) {
sort(v.begin(), v.begin() + i);
if (flag == 0) {
cout << v[0];
for (int k = 1; k < N; k++) cout << " " << v[k];
return;
}
if (_ans == v) {
cout << "Insertion Sort" << endl;
flag = 0;
}
}
}
void MERGE_SORT() {
int flag = 0;
/*
这个地方必须是step/2<N,不然有测试点3过不去。大家想想啊,假如你写成step<N;
如果(我说的是如果)你的N等于15,在某一次你的step = 8,那么你在sort前8个元素
和后7个元素后,你的step*2 后就大于N了,就不会做最后一轮归并了。所以写成step/2
的目的是为了保证整个数组都能被排序完。
*/
for (int step = 2; step / 2 < N; step *= 2) {
for (int i = 0; i < N; i+=step)
sort(v.begin() + i, v.begin() + min(i + step, N));
if (flag == 1) {
cout << v[0];
for (int k = 1; k < N; k++) cout << " " << v[k];
return;
}
if (_ans == v) {
cout << "Merge Sort" << endl;
flag = 1;
}
}
}
int main() {
cin >> N;
for (int i = 0; i < N; i++) {
int temp; cin >> temp;
ans.push_back(temp);
}
for (int i = 0; i < N; i++) {
int temp; cin >> temp;
_ans.push_back(temp);
}
v = ans;
INSERT_SORT();
v = ans;
MERGE_SORT();
}