1035 插入与归并 (25 分)测试点分析

这算是比较难的一个题目了。有好几个坑。
首先通过比对第一个不满足有序的数字,确实可以找出来是哪种排序方式。
(找到第一个顺序不对的数以后从这个地方往后遍历,看看和原数组是不是一样即可找排序方式)

But找出排序方式以后,这只是完成了第一步,还有需要按规定方式再迭代一次,这就比较麻烦了。
对于插入排序还好,调用sort函数往后以移动一个数即可。
但是归并排序就麻烦多 了。
坑点如下:
①.下次需要归并的数列,最后不足归并数量(测试点5)
例如:
11
3 1 2 8 7 5 9 4 11 0 6
1 2 3 8 4 5 7 9 0 6 11
②.归并的迭代次数问题(测试点6),不可以通过扫描前面的有次序的数的个数得到迭代次数
例如:
8
1 2 3 8 4 3 1 2
1 2 3 8 3 4 1 2
附AC代码如下:

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
int main() {
	int N, i, m;
	set<int>S;
	scanf_s("%d", &N);
	vector<int>V(N), T(N);
	for (int i = 0; i < N; i++) cin >> V[i];
	for (int i = 0; i < N; i++) cin >> T[i];
	for (i = 1; i < N; i++) { if (T[i] < T[i - 1])break;}
	for (m = i; m < N; m++) {
		if (V[m] != T[m])break;
	}
	if (m >= N) {
		printf("Insertion Sort\n"); 
		sort(V.begin(), V.begin() + i + 1);
		for (int i = 0; i < N; i++) {
			i == 0 ? cout << V[i] : cout << " " << V[i];
		}
	}
	else {
		printf("Merge Sort\n");
		S.insert(i);
		for (int j = i+1; j <= N - 1; j++) if (T[j] < T[j - 1]) {	S.insert(j - i); i = j;}
		int j = 0;
		while (j<=N-1) {
			if(j+*S.begin()*2<=N)sort(T.begin()+j, T.begin() + j + *S.begin()*2);
			else sort(T.begin() + j, T.end());
			j += *S.begin() * 2;
		}
		for (int i = 0; i < N; i++)i == 0 ? cout << T[i] : cout << " " << T[i];
	}
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值