题意:
根据输入的原始序列和排序算法产生的中间序列,判断是插入排序还是归并排序。
解法:
直接对原始序列进行插入排序每一步判断是否与中间序列相同,若是,则再进行完下一步后输出;不是则进行归并排序,归并排序从头开始排序,判断与中间序列是否相同,是则进行完下一步输出,不是则继续排序。
总结:插入排序是前面排好序的部分有序,后面部分与原始序列还是相同。可以根据这个进行判断是否是插入排序。这一题难点在归并排序,参考了书上的讲解和代码,写了很久才写出来。原来进行归并排序时,我不是直接从原始序列开始,而是从头开始找到排好序的部分的长度,记为半步长,然后进行一次归并排序,结果最后一个测试点没有通过,不知道是不是有存在相邻两次排序结果相同的序列。
(用时:2:24:40.61)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<cstring>
#include<cmath>
//#include<bits/stdc++.h>
using namespace std;
bool isInsertSort(vector<int> initial,vector<int> sortArray)
{
int t=0,j;
bool flag = false;
for(int i=1; i<initial.size(); i++) {
t= initial[i];
for(j=i-1; j>=0&&initial[j]>t; j--) {
initial[j+1] =initial[j];
}
initial[j+1] =t;
if(flag) {
break;
}
if(initial==sortArray) {
flag = true;
}
}
if(flag) {
printf("Insertion Sort\n");
for(int i=0; i<initial.size(); i++) {
if(i>0) {
printf(" ");
}
printf("%d",initial[i]);
}
printf("\n");
}
return flag;
}
void mergSort(int length,vector<int> sortArray,vector<int> initial)
{
printf("Merge Sort\n");
vector<int> result = initial;
vector<int> result1(result.size());
int i=0,j;
int m=0,t=1;
int n=t+t;
m = t;
int k=0;
bool flag = true;
int first = 1;
while(flag) {
flag= false;
if(result!=sortArray) {
flag= true;
}
i =0;
j = t;
m=j;
n = t+t;
k=0;
while(i<length) {
for(; i<m&&j<n; k++) {
if(result[i]<result[j]) {
result1[k] = result[i++];
} else {
result1[k] = result[j++];
}
}
if(i<m) {
for(; i<m; i++) {
result1[k++] = result[i];
}
}
if(j<n) {
for(; j<n; j++) {
result1[k++] = result[j];
}
}
i=j;
j=n+t;
m=j;
n=j + t;
if(m>length) {
break;
}
if(n>length) {
n=length;
}
}
result = result1;
t=t*2;
}
for( i=0; i<length; i++) {
if(i>0) {
printf(" ");
}
printf("%d",result[i]);
}
printf("\n");
}
int main()
{
int n;
scanf("%d",&n);
vector<int> initial,sortArray;
int t;
for(int i=0; i<n; i++) {
scanf("%d",&t);
initial.push_back(t);
}
for(int i=0; i<n; i++) {
scanf("%d",&t);
sortArray.push_back(t);
}
vector<int> initial1 = initial;
if(!isInsertSort(initial1,sortArray)) {
mergSort(n, sortArray,initial);
}
return 0;
}