- 这个题在判断出来是meger排序的时候,circu不一定是实际已合并的长度,也可能是其倍数。导致了最后一个测试点错误,所以要更新circu。
- 更新circu的时候,从2开始试,遍历全部排序点间的关系,有一个是前面一个点大于后面的点,就能说明circu==len。但是还要避免实际的circu是len的倍数。
- 。。。。还有merge排序不是很熟练
#include<stdio.h>
int pre[100];
int after[100];
void print(int n) {
for(int i=0; i<n-1; i++) printf("%d ",after[i]);
printf("%d",after[n-1]);
}
void merge1(int *a,int *tempa,int l,int r,int rend) {
int lend=r-1;
int temp=l;
int num=rend-l+1;
while(l<=lend&&r<=rend) {
if(a[l]>a[r]) tempa[temp++]=a[r++];
else tempa[temp++]=a[l++];
}
while(l<=lend) tempa[temp++]=a[l++];
while(r<=rend) tempa[temp++]=a[r++];
for(int i=num; i>0; i--,rend--) {
a[rend]=tempa[rend];
}
}
void merge(int *a,int n,int circu) {
int tempa[n];
int i;
for( i=0;i<=n-2*circu;i+=2*circu)
merge1(a,tempa,i,i+circu,2*circu-1+i);
if(n-i+1>circu) merge1(a,tempa,i,i+circu,n-1);
print(n);
}
int getcircu(int n){
int flag=1,len;
for( len=2;flag;len*=2){
for(int j=len;j<n;j+=2*len){
if(after[j-1]>after[j]){
flag=0;
break;
}
}
}
return len/2;
}
bool judge(int n) {
int circu=1;
for(;after[circu]>=after[circu-1]&&circu<n;circu++);
for(int i=circu; i<n; i++) {
if(pre[i]!=after[i]) {
printf("Merge Sort\n");
circu=getcircu(n);
merge(after,n,circu);
return 1;
}
}
printf("Insertion Sort\n");
for(int i=circu; i<=circu; i++) {
int temp=after[i],j;
for( j=i; j>0&&after[j-1]>temp; j--) {
after[j]=after[j-1];
}
after[j]=temp;
}
print(n);
return 0;
}
int main() {
int n;
scanf("%d",&n);
for(int i=0; i<n; i++) scanf("%d",&pre[i]);
for(int i=0; i<n; i++) scanf("%d",&after[i]);
judge(n);
}