地址: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;
}
不知道为什么这里会出现段错误,没看出什么地方发生地址越界了