插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。
区分出中间序列是哪种排序算法产生的,其实只需判断“插入排序能否产生该中间序列”即可。如果插入排序可以产生,那么归并排序必然不能有该中间序列,因为如果归并排序也能产生该中间序列,那么两种排序都是可能的,无法判断准确结果,而题目保证不会有这种情况。既然题目保证了两种排序非此即彼,那么只判断一个更容易判断的插入排序即可。
插入函数代码实现
#include <stdio.h>
void print(int a[], int n ,int i){
printf("%d:",i);
for(int j=0; j<8; j++){
printf("%d",a[j]);
}
printf("\n");
}
//直接插入排序函数
void InsertSort(int a[], int n)
{
for(int i= 1; i<n; i++){
if(a[i] < a[i-1]){
int j= i-1;
int x = a[i];
while(j>-1 && x < a[j]){ //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间
a[j+1] = a[j];
j--;
}
a[j+1] = x; //插入到正确位置
}
print(a,n,i);//打印每次排序后的结果
}
}
int main(){
int a[8] = {3,1,7,5,2,4,9,6};
InsertSort(a,8);
return 0;
}
归并排序代码实现
#include<stdio.h>
/*归并排序*/
void Merge_Sort(int *arr, int *temparr,int start,int mid,int end)
{
int left_start = start ;
int left_end = mid ;
int right_start = mid+1 ;
int right_end = end ;
int index = start ;
while(left_start<=left_end&&right_start<=right_end)
{
if(arr[left_start]>arr[right_start])
temparr[index++] = arr[right_start++] ;
else
temparr[index++] = arr[left_start++] ;
}
while(left_start<=left_end)
temparr[index++] = arr[left_start++] ;
while(right_start<=right_end)
temparr[index++] = arr[right_start++] ;
for(index = start ;index<=end ;++index)
arr[index] = temparr[index] ;
}
void Sort_Message(int *arr, int *temparr,int start,int end)
{
if(start<end)
{
int mid = (start+end)/2 ;
Sort_Message(arr,temparr,start,mid) ;
Sort_Message(arr,temparr,mid+1,end) ;
Merge_Sort(arr,temparr,start,mid,end) ;
}
}
int main(void)
{
int a[] = {9,2,5,3,7,4,8,0} ;
int n = sizeof(a)/sizeof(a[0]) ;
int i, temp[8] ;
printf("原序列为:") ;
for(i=0;i<n;++i)
printf("%d ",a[i]) ;
printf("\n") ;
Sort_Message(a,temp,0,n-1) ;
printf("\n排后序列:") ;
for(i=0;i<n;++i){
printf("%d ",a[i]) ;
}
printf("\n") ;
return 0 ;
}