A1089 Insert or Merge (25 分)

一、技术总结

  1. 看到是一个two pointers问题,核心是要理解插入排序和归并排序的实现原理,然后判断最后实现
  2. 可以知道a数组和b数组怎么样判断是插入排序还是归并排序,因为插入排序是来一个排一个,所以知道当发现有位置当前数比后面大时,进而再判断后面的每一位是否啊a、b数组都相等,如果是那么就是插入排序,再在后面进行一轮排序即可。如果不是就是归并排序。最主要的问题是判断归并排序到哪一轮了,使用while循环模拟归并排序,对数组a进行归并排序,直到与数组b相等,再进行一轮排序就是输出结果了。

二、参考代码

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int a[100], b[100], i, j, n;
	cin >> n;
	for(int i = 0; i < n; i++){
		cin >> a[i];
	}
	for(int i = 0; i < n; i++){
		cin >> b[i];
	}
	for(i = 0; i < n-1 && b[i] <= b[i+1]; i++);
	for(j = i+1; j < n && a[j] == b[j]; j++);
	if(j == n){
		printf("Insertion Sort\n");
		sort(a, a+i+2);
	}else{
		printf("Merge Sort\n");
		int flag = 1, k = 1;
		while(flag){
			flag = 0;
			for(i = 0; i < n; i++){
				if(a[i] != b[i]){
					flag = 1;
				}
			}
			k = k*2;
			for(i = 0; i < n/k; i++){
				sort(a+i*k, a+(i+1)*k);
			}
			sort(a+n/k*k, a+n);
		}
	}
	for(j = 0; j < n; j++){
		if(j != 0){
			printf(" ");
		}
		cout << a[j];
	}
	return 0;
}
posted @ 2019-11-18 15:22  睿晞  阅读(140)  评论(0编辑  收藏  举报