PAT 1035. 插入与归并(25)
Posted 来一点音乐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 1035. 插入与归并(25)相关的知识,希望对你有一定的参考价值。
根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
输入样例1:
10 3 1 2 8 7 5 9 4 6 0 1 2 3 7 8 5 9 4 6 0
输出样例1:
Insertion Sort 1 2 3 5 7 8 9 4 6 0
输入样例2:
10 3 1 2 8 7 5 9 4 0 6 1 3 2 8 5 7 4 9 0 6
输出样例2:
Merge Sort 1 2 3 8 4 5 7 9 0 6
考察插入排序与归并排序,需注意的是,此处考察的是归并排序的自底向上的方法而非递归形式的自顶向下。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<ctype.h> 5 #include<math.h> 6 //交换元素 7 void swap(int &a,int &b){ 8 int temp = a; 9 a = b; 10 b = temp; 11 } 12 //打印数组 13 void print(int a[],int n){ 14 printf("%d",a[0]); 15 for(int i=1;i<n;i++){ 16 printf(" %d",a[i]); 17 } 18 printf("\n"); 19 } 20 21 //归并排序中的合并操作 22 void merge(int a[],int start,int mid,int end){ 23 int c[200]; 24 int start1 = mid+1; 25 int k = 0; 26 int h = start; 27 while(start<=mid&&start1<=end){ 28 if(a[start]<a[start1]) 29 c[k++] = a[start++]; 30 else 31 c[k++] = a[start1++]; 32 } 33 while(start<=mid) 34 c[k++] = a[start++]; 35 while(start1<=end) 36 c[k++] = a[start1++]; 37 for(int i=0;i<k;i++) 38 a[i+h] = c[i]; 39 40 } 41 //归并排序中自顶向下的递归形式 42 /*void mergeSort(int a[],int start,int end){ 43 if(start<end){ 44 int mid = (start+end)/2; 45 mergeSort(a,start,mid); 46 mergeSort(a,mid+1,end); 47 merge(a,start,mid,end); 48 print(a,10); 49 } 50 }*/ 51 52 //归并排序中自底向下的形式 53 void mergeSort(int a[],int length,int n){ 54 int i; 55 for(i=0;i+2*length-1<n;i=i+length*2) 56 merge(a,i,i+length-1,i+2*length-1); 57 if(i+length-1<n) 58 merge(a,i,i+length-1,n); 59 } 60 61 int main(){ 62 int n; 63 int a[200]; 64 int a1[200]; 65 int b[200]; 66 int j; 67 int flag=0,flag1=0; 68 scanf("%d",&n); 69 for(int i=0;i<n;i++){ 70 scanf("%d",&a[i]); 71 a1[i] = a[i]; 72 } 73 for(int i=0;i<n;i++){ 74 scanf("%d",&b[i]); 75 } 76 //插入排序 77 for(int i=1;i<n;i++){ 78 for(j=i;j>0;j--){ 79 if(a[j]<a[j-1]){ 80 swap(a[j],a[j-1]); 81 } 82 } 83 if(flag){ 84 printf("Insertion Sort\n"); 85 print(a,n); 86 return 0; 87 } 88 for(j=0;j<n;j++){ 89 if(a[j]!=b[j]){ 90 break; 91 } 92 } 93 if(j==n){ 94 flag = 1; 95 } 96 } 97 //归并排序 98 int length; 99 for(length=1;length<n;length=length*2){ 100 mergeSort(a1,length,n-1); 101 if(flag1){ 102 printf("Merge Sort\n"); 103 print(a1,n); 104 return 0; 105 } 106 for(j=0;j<n;j++){ 107 if(a1[j]!=b[j]) 108 break; 109 } 110 if(j==n) 111 flag1 = 1; 112 } 113 114 115 116 }
以上是关于PAT 1035. 插入与归并(25)的主要内容,如果未能解决你的问题,请参考以下文章