【PAT】1089 Insert or Merge 24分?测试点二?测试点三?

【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();
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值