PAT --- B1035 --- 插入与归并

地址:1035 插入与归并 - PAT (Basic Level) Practice (中文) (pintia.cn)

题目

答案:

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 111;
int origin[N],tempOri[N],changed[N];
int n;
// 判断两个数组是否相同 
bool isSame(int A[],int B[]){
	for(int i=0;i<n;i++){
		if(A[i] != B[i]) return false;
	}
	return true;
}

// 输出数组
bool showArray(int A[]){
	for(int i=0;i<n;i++){
		printf("%d",A[i]);
		if(i<n-1) printf(" ");
	} 
	printf("\n");
} 
// 插入排序 
bool insertSort(){
	bool flag = false;  // 标记位用于记录是否与中间过程相同 
	for(int i=1;i<n;i++){
		if(i != 1 && isSame(tempOri, changed)){ // 要去除第一项从第二项开始记录 
			flag = true;
		}
		// 经典插入排序代码 
		int temp = tempOri[i], j=i;
		while(j > 0 && tempOri[j-1]>temp){
			tempOri[j] = tempOri[j-1];
			j--;
		}
		tempOri[j] = temp;
		// 如果目标标记位为true,说明已经找到中间过程 
		if(flag == true){
			return true;
		}
	}
	return false;
}
// 归并排序 
void mergeSort(){   // 归并排序 
	bool flag = false;   // 同样用于记录是否与中间过程相同 
	// 经典归并排序,在组间排序时,可以直接调用sort函数 
	for(int step = 2;step/2 <= n;step *= 2){   
		if(step != 2 && isSame(tempOri, changed)){    // 同样的在判断时,要去除初始数列的影响 
			flag = true;
		}
		for(int i=0;i<n;i+=step){
			// 在组内排序时如果直接使用tempOri+i+step最后一组可能会出数组越界的影响,所以要注意 
			sort(tempOri+i,tempOri+min(i+step,n));
		}
		if(flag == true){   // 如果存在则直接输出该数组,也可以放在main函数中一起输出 
			showArray(tempOri);
			return;
		}
	} 
}


int main(){
	scanf("%d",&n);
	// 输入初始数组,并且将暂存数组也初始化为初始数组 
	for(int i=0;i<n;i++){
		scanf("%d",&origin[i]);
		tempOri[i] = origin[i];
	} 
	for(int i=0;i<n;i++){
		scanf("%d",&changed[i]);  // 目标改变数组 
	}
	if(insertSort()){
		printf("Insertion Sort\n");
		showArray(tempOri);
	}else{
		printf("Merge Sort\n");
		for(int i=0;i<n;i++){
			tempOri[i] = origin[i];  // 还原tempOri数组 
		}
		mergeSort();
	}
	return 0;
}

不知道为什么这里会出现段错误,没看出什么地方发生地址越界了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值