当前位置: 代码迷 >> 综合 >> PAT 1035. 插入与归并(25)
  详细解决方案

PAT 1035. 插入与归并(25)

热度:33   发布时间:2023-12-25 04:38:28.0

这里写图片描述

1.这道题先给我们展示了两种算法,接下来我们就要用这两种算法来对原数组进行排序,每进行一个阶段就和目标数组比较,一模一样的话就跳出循环。
2.插排:比如 9 8 7 6 5 4 3 2 1
第一次插排->8 9 7 6 5 4 3 2 1
第二次插排->7 8 9 6 5 4 3 2 1
第三次插排->6 7 8 9 5 4 3 2 1
3.归并:比如 9 8 7 6 5 4 3 2 1
第一次归并 8 9 6 7 4 5 2 3 1 以2个为一个整体
第二次归并 6 7 8 9 2 3 4 5 1 以4个为一个整体,不足4个的为一个整体
第三次归并 2 3 4 5 6 7 8 9 1 以8个为一个整体,不足8个的为一个整体
第四次归并 1 2 3 4 5 6 7 8 9 以16个为一个整体,不足16个的为一个整体
4.题目已经确保只有一种情况,所以判断完break出去就可以了,同时不需要再进行另一种算法的检测了
5.具体见代码
6.实现插排和归并我都用了qsort,只要我确定好起始点就行了

#include <stdio.h>
#include <stdlib.h>
int t;
int compare(int a[],int b[]){
   //比较两个数组是否一样for(int i=0;i<=t-1;i++){if(a[i]!=b[i]) return 0;}return 1;
}
int cmp(const void *a,const void *b){return *(int *)a-*(int *)b;
}
void show(int a[]){
   //打印输出函数int flag=0;for(int j=0;j<=t-1;j++){if(flag==0){printf("%d",a[j]);flag=1;} else printf(" %d",a[j]);}
}
void Merge(int merge[],int t,int ge){int ci;if(t%ge==0) ci=t/ge;//10个2,2一组共5组else ci=t/ge+1;//10个4,4一组,还多一组for(int q=1;q<=ci;q++){int start=ge*(q-1);//确定起始点,步长为geif(q==ci) qsort(merge+start,t-start,sizeof(merge[0]),cmp);//最后一组个数一般少,要确定好比较的个数else qsort(merge+start,ge,sizeof(merge[0]),cmp);}
}
int main(){scanf("%d",&t);int a[t];int b[t];int sort[t];int merge[t];for(int i=0;i<=t-1;i++){scanf("%d",&a[i]);//originalsort[i]=merge[i]=a[i];}for(int i=0;i<=t-1;i++){scanf("%d",&b[i]);//for comparing}for(int i=2;i<=t;i++){qsort(sort,i,sizeof(sort[0]),cmp);if(compare(sort,b)==1){printf("Insertion Sort\n");qsort(sort,i+1,sizeof(sort[0]),cmp);show(sort);return 0;}   }int ge=1;for(int i=1;i<=t;i++){ge*=2;Merge(merge,t,ge);if(compare(merge,b)==1){ge*=2;printf("Merge Sort\n");Merge(merge,t,ge);show(merge);break;}}printf("\n");return 0;
}