根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成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
/////////
/////////
思路:由于之前写过插入排序算法,这次就直接搬过来用了,但是这样代码比较不简洁。网上代码判断是否是插入排序的思路是:先找出给出的中间序列数组中有序部分的最后一个元素下标i,再从有序部分之后的无序序列中第一个元素开始(++i),与未排序的原数组一 一进行比对,若直到数组最后一个元素都完全相同,则表示,此中间序列为前半部分已排序而后半部分未排序,即为插入排序,使用sort()将原数组的0~i进行排序(此时i是无序序列中第一个元素)。
否则就是归并排序。由于一般的归并排序算法是递归的,因此不能直接输出下一次排序结果,要改进算法。此处参考了网上算法,大意为:将原始数组分成两个两个的小序列,一 一内部排序,同时将非偶数序列的尾巴部分排序;再将两个序列合并(k=k*2,k即为小序列中的元素个数),继续内部排序、序列尾巴排序……直到某一排序后序列与给出的中间序列相同,则再打印、进行一次归并排序并跳出循环。
以下为摘抄的网上关于判断是否是插入排序的算法:
for( i=0; A2[i]<=A2[i+1] && i<N-1; i++ ) ; // i作为有序序列最后一个元素下标退出循环
for( j=++i; A1[j]==A2[j] && j<N; j++ ) ; // A1 A2从 第一个无序的元素开始 逐一比对
if( j==N ){// 前半部分有序而后半部分未改动可以确定是插入排序
cout<<"Insertion Sort"<<endl;
sort( A1, A1+i+1 );
}
//////
//////
以下是我这道题的代码:
#include <iostream>
#include<algorithm>
using namespace std;
int InsertSort(int oriArray[], int Array[], int n)
{
int temp;
int i,j;
int same=1;
for(i=1;i<n;i++)
{
temp = Array[i];
j = i-1;
while(j>=0 && temp<Array[j])
{
Array[j+1] = Array[j];
j = j-1;
}
Array[j+1] = temp;
//////////////////
if(same==0){
cout<<"Insertion Sort"<<endl;
for(int k=0;k<n-1;k++){
cout<<Array[k]<<" ";
}
cout<<Array[n-1];
return 1;
}
same=0;
for(int k=0;k<n;k++){
if(Array[k]!=oriArray[k])
{
same=1;
break;
}
}
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);
int Array[n];
int temp[n];
int oriArray[n];
for(int i=0;i<n;i++){
scanf("%d",&Array[i]);
temp[i] = Array[i];
//oriArray[i] = Array[i];
}
for(int i=0;i<n;i++){
scanf("%d",&oriArray[i]);
}
int flag;
int f=1;
int k=1;
flag = InsertSort(oriArray, temp, n);
if(flag==0){
cout<<"Merge Sort"<<endl;
for(int i=0;i<n;i++)
{
temp[i] = Array[i];
}
while(f){
f=0;
for(int i=0;i<n;i++){
if(Array[i]!=oriArray[i]){
f=1;
break;
}
}
k = k*2;
for(int i=0;i<n/k;i++){
sort(Array+i*k,Array+(i+1)*k);
}
sort(Array+k*(n/k),Array+n);
}
for(int i=0;i<n-1;i++){
cout<<Array[i]<<" ";
}
cout<<Array[n-1];
}
return 0;
}