1035 插入与归并

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1035 插入与归并相关的知识,希望对你有一定的参考价值。

1. 这一题,首先要会插入排序和归并排序的写法。对于归并排序,可以用非递归+sort最简便。把每一趟的结果存进二维数组。

2. 单独封装一个函数,比较两个一维数组是否完全一样。

3. 由于归并比插入的复杂度低,趟数少,所以先判断归并排序。

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>

using namespace std;
typedef long long LL;

const int maxn = 10000;
const int INF = 1000000000;//INF:下确界  
const LL SUP = (1LL<<63)-1;//SUP:上确界 
const double eps = 1e-5;


//n是数组长度、元素从0开始 
int insertSort(int I[],int n,int insert[maxn/2][100]){//插入排序
	int t = 0;
 
	for(int i=1;i<n;i++){
		int temp = I[i],j=i;
		while(j>0&&temp<I[j-1]){
			I[j] = I[j-1];
			j--;
		}
		I[j] = temp;
		//每一趟结束,将结果存进insert数组
		for(int k=0;k<n;k++){
			insert[t][k] = I[k];
		}
		t ++;
	}
	
	return t;
}

int mergeSort(int M[],int n,int merge[100][100]){//非递归的归并排序 
	
	int t = 0;
	
	for(int step=2;step/2<n;step*=2){
		for(int i=0;i<n;i+=step){
			sort(M+i,M+min(i+step,n));
		}
		//每一趟结束,将结果存进merge数组
		for(int i=0;i<n;i++){
			merge[t][i] = M[i];
		}
		t ++;	 
	}
	
	return t; 
}

bool ifSame(int A[],int B[],int n){//比较一维数组A和B是否相等,n为元素个数
	for(int i=0;i<n;i++){
		if(A[i]!=B[i])return false;
	} 
	return true;
}



int main(){
	int merge[100][100];
	int insert[maxn/2][100];
	int M[100],I[100];//分别存放排序过程,传入需要排的序列

	int init[100],process[100];//存放读入的数组和过程数组
	
	int n;
	
	scanf("%d",&n);
	for(int i=0;i<n;i++){//读入原始数组 
		scanf("%d",&init[i]);
	}
	for(int i=0;i<n;i++){//读入过程数组 
		scanf("%d",&process[i]);
	}
	
	//将原始数组分别存入M和I
	for(int i=0;i<n;i++){
		M[i] = init[i];
	}
	for(int i=0;i<n;i++){
		I[i] = init[i];
	} 
	 
	//分别进行插入排序和归并排序
	int insert_t = insertSort(I,n,insert);
	int merge_t = mergeSort(M,n,merge); 
	
	//进行比对,由于归并排序的过程数少一些,放在前面
	for(int i=0;i<merge_t;i++){

		if(ifSame(process,merge[i],n)){
			printf("Merge Sort\\n");
			for(int j=0;j<n;j++){
				printf("%d",merge[i+1][j]);
				if(j!=n-1)printf(" ");
			}
			return 0;
		}
	}
	//插入排序比对
	for(int i=0;i<insert_t;i++){
		if(ifSame(process,insert[i],n)){
			printf("Insertion Sort\\n");
			for(int j=0;j<n;j++){
				printf("%d",insert[i+1][j]);
				if(j!=n-1)printf(" ");
			}
			return 0;
		}
	} 
	
	
	return 0;
}

以上是关于1035 插入与归并的主要内容,如果未能解决你的问题,请参考以下文章

P 1035 插入与归并

1035 插入与归并 测试点256

PAT 1035. 插入与归并

PAT排序题---1035 插入与归并 (25分)

1035 插入与归并 (25 分)

B1035 插入与归并