给出原始数组和中间数组,求是哪种排序方法,并得出下一次迭代的数组。
思路:先判断是不是快速排序,如果不是就是归并排序。
每次排序,先判断是不是目标数组,然后再排序,如果是,之后排序得出的数组就是下一次迭代的数组。
忘记插入排序的模板咋写的了,查了一下天勤。
void InsertSort(int R[],int n){
inti,j;
int temp;
for(int i=1;i<n;i++){
temp=R[i];
j=i-1;
while(j>=0 && temp<R[j]){
R[j+1]=R[j];
j--;
}
R[j+1]=temp;
}
}
归并排序用算法笔记上的非迭代方法。
注意点:
1.输出之后不能多空格。
2.因为先进行插入排序的判断,数组元素有改变,所以如果插入排序不能得到目标数组,必须还原成原始数组,再进行归并排序。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int O[111],R[111],T[111];
bool isSame(int R[],int T[]){ //确认与目标数组是否相同
for(int i=0;i<n;i++){
if(R[i]!=T[i])
return false;
}
return true;
}
void showArray(int R[]){ //输出数组
for(int i=0;i<n;i++){
printf("%d",R[i]);
if(i<n-1) printf(" ");
}
}
bool insertSort(){
bool flag=false;
int temp;
for(int i=1;i<n;i++){ //先确认,再排序,就可直接得出下一轮迭代的数组
if(i!=1&&isSame(R,T)){ //当中间的步骤数组跟目标相同,且不是初始序列
flag=true;
}
temp=R[i]; //下面是插入排序的模板
int j=i-1;
while(j>=0 && temp<R[j]){ //当前面的数组元素比R[i]小的时候,R[i]往前挪,R[j]往后
R[j+1]=R[j];
j--;
}
R[j+1]=temp;
if(flag==true) return true;
}
return false;
}
void mergeSort(){
bool flag=false;
for(int step=2;step/2<=n;step*=2){
if(step!=2 && isSame(R,T)){
flag=true;
}
for(int i=0;i<n;i+=step){
sort(R+i,R+min(i+step,n));
}
if(flag==true){
showArray(R);
return;
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&O[i]); //输入起始数组
R[i]=O[i]; //R[i]为备份数组
}
for(int i=0;i<n;i++){
scanf("%d",&T[i]); //T[i]为目标数组
}
if(insertSort()){ //如果插入排序可以得到目标数组,则输出插入排序和下一次迭代的数组
printf("Insertion Sort\n");
showArray(R);
}else{
printf("Merge Sort\n");
for(int i=0;i<n;i++){
R[i]=O[i]; //还原备份数组
}
mergeSort(); //进行归并排序
}
return 0;
}