代码:
对于归并排序的操作采取二分思想,学习自该博客
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define N 1000001
using namespace std;
int n;
int a[101],b[101];
int compare(int a[],int b[],int length)
{
for(int i=1;i<=length;i++)
{
if(a[i]!=b[i])
{
return 0;
}
}
return 1;
}
//合并两个数组,类似于之前学过的合并两个有序链表
void Merge(int arr[],int low,int mid,int high)
{
int i=low,j=mid+1,k=0;
int *temp= new int[high-low+1];//temp数组暂存合并的有序序列
while(i<=mid&&j<=high)
{
if(arr[i]<=arr[j])
{
temp[k++]=arr[i++];
}
else
{
temp[k++]=arr[j++];
}
}
while(i<=mid)
{
temp[k++]=arr[i++];
}
while(j<=high)
{
temp[k++]=arr[j++];
}
for(int i=low,k=0;i<=high;i++,k++)//将排好序的数组(链表)重新赋给arr数组
{
arr[i]=temp[k];
}
delete []temp;//释放内存,由于指向的是数组,必须用delete[]
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
int flag=-1;
for(int i=1;i<=n;i++)
{
if(i==1)
{
continue;
}
if(b[i]>=b[i-1])
{
continue;
}
else
{
flag=i;
break;
}
}
int f=0;
for(int i=flag;i<=n;i++)
{
if(b[i]==a[i])
{
continue;
}
f=1;
break;
}
if(f)//归并排序
{
int mid,high;
int ff=0;
for(int s=1;s<=n;s*=2)
{
for(int low=1;low+s<=n;low+=2*s)
{
mid=low+s-1;
high=low+2*s-1;
if(high>n)
{
high=n;
}
Merge(a,low,mid,high);
}
if(ff)
{
break;
}
ff=compare(a,b,n);
}
cout<<"Merge Sort"<<endl;
for(int i=1;i<=n;i++)
{
if(i==n)
{
cout<<a[i]<<endl;
}
else
{
cout<<a[i]<<" ";
}
}
}
else
{
cout<<"Insertion Sort"<<endl;
sort(b+1,b+flag+1);
for(int i=1;i<=n;i++)
{
if(i==n)
{
cout<<b[i]<<endl;
}
else
{
cout<<b[i]<<" ";
}
}
}
return 0;
}