1089 Insert or Merge (25分)

之前采用 找第一个不满足有序的下标,然后从这个往后扫描,如果所有元素都相同,则断定是插入排序。
这次我准备试一下模拟,于是就模拟这个过程,如果找到了相同就返回。
事实上这样过不了测试点2,因为这个例子:

测试用例:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 5 7 8 9 4 6 0

对应输出应该为:

Insertion Sort
1 2 3 4 5 7 8 9 6 0

你的输出为:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

因为有时候多迭代一次仍然是这个样子,而系统默认这是最大次数的排序,所以只能是找规律确定插入排序。(当然你说我继续迭代,直到不同退出,这样也可以,就是麻烦些。)

最后两个测试点如果没过,说明你忽略了一种情况,比如:

1 2 3 7 5 8 6

如果此时要进行个数为4的迭代,你的算法无法进行,因为你没考虑后面那些不够迭代次数的元素,事实上他们也应该参与迭代

附本人AC代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N, index, flag = 0,flag1 = 0;
bool issame(vector<int>V1, vector<int>V2) {
	for (int i = 0; i < N; i++) {
		if (V1[i] != V2[i])return false;
	}
	return true;
}
int main() {
	scanf("%d", &N);
	vector<int>V1(N), V2(N), tmp;
	for (int i = 0; i < N; i++)scanf("%d", &V1[i]);
	for (int i = 0; i < N; i++) {
		scanf("%d", &V2[i]);
		if (i > 0 && V2[i] < V2[i - 1] && flag1 == 0) {
			flag1 = 1;
			index = i;
		}
	}
	int i = index;
	for (; i < N; i++) {
		if (V2[i] != V1[i]) break;
	}
	if (i ==N) {
		printf("Insertion Sort\n");
		sort(V2.begin(), V2.begin() + index + 1);
	}
	else {
		printf("Merge Sort\n");
		tmp=V1;
		for (int i = 1; i <= N; i *= 2) {
			int j = 0;
			for (; j + i <= N; j += i) {
				sort(tmp.begin() + j, tmp.begin() + j + i);
			}
			sort(tmp.begin() + j, tmp.end());
			if (flag == 1)break;
			if (issame(tmp, V2)) flag = 1;
		}
		V2 = tmp;
	}
	printf("%d", V2[0]);
	for (int i = 1; i < N; i++)printf(" %d", V2[i]);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值