根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
输入样例1:
1 2 3 |
10 3 1 2 8 7 5 9 4 6 0 1 2 3 7 8 5 9 4 6 0 |
输出样例1:
1 2 |
Insertion Sort 1 2 3 5 7 8 9 4 6 0 |
输入样例2:
1 2 3 |
10 3 1 2 8 7 5 9 4 0 6 1 3 2 8 5 7 4 9 0 6 |
输出样例2:
1 2 |
Merge Sort 1 2 3 8 4 5 7 9 0 6 |
会写插入和归并排序即可轻松解决……
但是感觉自己写的麻烦了一些2333
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
#include<stdio.h> #include<stdlib.h> int compare(const void *a,const void *b) { return *(int *)a-*(int *)b; } int arraycmp(int *a,int *b,int n) { int i; for(i=0;i<n;i++) { if(a[i]!=b[i]) return 0; } return 1; } int issort(int *a,int i) { int temp,j; temp=a[i]; for(j=i-1;j>=0;j--) { if(a[j]>temp) { a[j+1]=a[j]; } else { break; } } a[j+1]=temp; } int mgsort(int *a,int n,int size) { int i,edge; for(i=0;i<n;i+=size*2) { edge=i+size*2-1; if(edge>=n) { edge=n-1; } if(edge<=i) return 0; qsort(a+i,edge-i+1,sizeof(int),compare); } } int main() { int i,j,flag=0,n,num[100],sorted[100],insertion[100],merge[100]; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",num+i); insertion[i]=num[i]; merge[i]=num[i]; } for(i=0;i<n;i++) { scanf("%d",sorted+i); } for(i=1;i<n;i++) { issort(insertion,i); if(arraycmp(insertion,sorted,n)) { flag=1; i++; break; } } if(flag) { printf("Insertion Sort\n"); if(i!=n) issort(insertion,i); for(i=0;i<n-1;i++) printf("%d ",insertion[i]); printf("%d\n",insertion[i]); } else { printf("Merge Sort\n"); for(i=1;i<n;i*=2) { mgsort(merge,n,i); if(arraycmp(merge,sorted,n)) { mgsort(merge,n,i*2); break; } } for(i=0;i<n-1;i++) printf("%d ",merge[i]); printf("%d\n",merge[i]); } } |