1089 Insert or Merge (25 分)
思路
插入排序和归并排序
归并排序需要用到双指针游走,再借用sort
代码
#include<bits/stdc++.h>
using namespace std;
const int N =105;
int origiin[N],tempOri[N],changed[N];
int n;
bool isSame(int A[],int B[])
{
for(int i=0;i<n;i++)
if(A[i] !=B[i])return false ;
return true;
}
void showArray(int A[])
{
for(int i=0;i<n;i++)
{
cout<<A[i];
if(i!=n-1)cout<<" ";
}
cout<<endl;
}
bool insertSort() //插入排序
{
bool flag = false;
for(int i =1;i<n;i++)
{
if(i!=1 && isSame(tempOri,changed))
flag =true;
int temp = tempOri[i],j=i;
while(j>0 && tempOri[j-1] > temp )
{
tempOri[j] = tempOri[j-1];
j--;
}
tempOri[j] =temp;
if(flag)
return true;
}
return false;
}
void mergeSort() //归并排序
{
bool flag = false;
for(int step = 2; step/2 <=n ;step*=2)
{
if(step!=2 && isSame(tempOri,changed))
flag = true;
for(int i= 0;i<n;i+=step)
sort(tempOri+i,tempOri+min(i+step,n));
if(flag)
{
showArray(tempOri);
return ;}
}
}
int main()
{
cin>>n;
for(int i = 0;i<n;i++)
{
cin>>origiin[i];
tempOri[i] = origiin[i];
}
for(int i = 0;i<n;i++)
cin>>changed[i];
bool flag = insertSort();
if(flag){
cout<<"Insertion Sort"<<endl;showArray(tempOri);return 0;}
for(int i = 0;i<n;i++)
tempOri[i] = origiin[i];
cout<<"Merge Sort"<<endl;
mergeSort();
}